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

时间:2016-06-15 16:01:12

标签: python python-2.7 variables

我需要将局部变量从一个python文件提供给另一个,将变量组合在一起然后将其他变量放回到第一个文件中。

我查看了cyclic dependencycombining local and global variables的SO讨论,但它似乎无法解决我的问题。

这是我想要完成的例子 几个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.py

中获取组合变量

一旦工作,将会添加其他报告,因此我希望简化变量/设置。

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

中全局管理它们

感谢任何想法。

2 个答案:

答案 0 :(得分:3)

您应该在mysettings.py中定义一个函数,并在其他文件中执行

#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)

这样您就不需要在不同的脚本中使用全局变量

答案 1 :(得分:0)

好的,最直接的方法是在报告模块中执行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)