Python:如何避免循环依赖性并结合局部 全局变量



我需要从一个 python文件馈送 local变量到另一个文件,将变量组合在那里,然后将其他变量恢复到第一个文件中。

我研究了cyclic dependencycombining local and global variables的讨论,但似乎并不能解决我的问题。

这是我要完成的骨架示例。
几个python脚本生成报告。

#report1.py

report_name = "daily_report1"

#report2.py

report_name = "daily_report2"

report_name是报告名称的变量,需要在包含大多数环境变量和常数的mysettings.py中采购。

#mySettings.py

save_location=  os.getcwd()+ "\" + report_name + "\"
report_file = report_name + "_" +   
str(datetime.datetime.today().strftime('%m_%d_%Y')) + ".xlsx"

代码然后查询服务器并获取csv文件并转换为xlsx并根据需要进行修改。

回到记者?.py

#report1.py

import mysettings.py
report_name = "daily_report1"
wb = openpyxl.load_workbook(report_file)
#Lots of other code
wb.save(save_location + report_file)

#report2.py

import mysettings.py
report_name = "daily_report2"
wb = openpyxl.load_workbook(report_file)
#Lots of other code
wb.save(save_location + report_file)

挑战是,我如何在report_name中馈送到mysettings.py,然后在report1.py和report2.py2.py

中获得合并的变量。

工作后,还会添加其他报告,因此我想简化变量/设置。

我还想在所有reports?.py中声明尽可能少的变量,而是在mysettings.py

中在全球管理它们

任何想法输入都将受到赞赏。

您应该在mysettings.py.py和中emem ecepute 在其他文件中执行

#mysettings.py

def getsettings(report_name):
    save_location=  os.getcwd()+ "\" + report_name + "\"
    report_file = report_name + "_" +   
    str(datetime.datetime.today().strftime('%m_%d_%Y')) + ".xlsx"
    return save_location, report_file

#report1.py

import mysettings.py
report_name = "daily_report1"
save_location, report_file = mysettings.getsettings(report_name)
wb = openpyxl.load_workbook(report_file)
#Lots of other code
wb.save(save_location + report_file)

这样,您不需要在不同脚本上使用全局变量

好的,最海峡的前进方式是在报告模块中执行mysettings.py中的代码:

report_name = "blah"
with open("mysettings.py","r") as common_code:
    exec(f.read(), globals()) #the globals() is actually implied if there is no second argument
print(report_file)

但是,在模块之间传递几个变量通常由environment字典处理,因此您可以让mysettings.py具有这样的函数:

def generate_report_file(environ):
    report_name = environ["report_name"]
    environ["save_location"] =  os.getcwd()+ "\" + report_name + "\"
    environ["report_file"] = report_name + "_" +   
             str(datetime.datetime.today().strftime('%m_%d_%Y')) + ".xlsx"

然后在报告文件中您可以手动处理环境:

environ = {}
environ["report_name"] = "blah"
mysettings.generate_report_file(environ)
print(environ["report_file"])

或利用全局名称空间以字典跟踪的事实:

report_name = "blah"
mysettings.generate_report_file(globals())
print(report_file)

最新更新