在我的问题中,我有一个由用户启动的python代码,如:
# file main.py
import sys
import mymodule
config = sys.argv[1]
导入另一个包含函数,类等的模块,如
# module.py
def check_config():
# do something with the content of 'config'
class Module(object):
# does something with the content of 'config'
如何从module.py
中访问'config'的值?我应该在这里使用'全球'变量吗?或者是否有更复杂的pythonic方法来解决这个问题?
另外,我不想为我在其他模块中使用的每个函数和类定义一个参数'config'...
进一步说明:main.py
导入其他模块,而不是相反......
答案 0 :(得分:3)
您应该将global
作为参数传递,而不是试图与config
进行争吵。
import sys
import mymodule
config = sys.argv[1]
checked = mymodule.check_config(config)
mod = mymodule.Module(config)
def check_config(config):
# do something with the content of 'config'
class Module(object):
# does something with the content of 'config'
def __init__(self, config):
# initialise with config
尽可能避免使用global
。如果您需要修改config
,只需让模块函数返回它。
config = change_config(config)
def change_config(config):
...
return config
但是,另一种方法是在module.py
中定义一个值,该值将存储默认情况下不保留任何内容的信息。然后,只要file main.py
导入module.py
并且配置数据准备就绪,您就可以将数据分配给module.py
的配置名称。像这样:
import sys
import mymodule
config = sys.argv[1]
mymodule.config = config
mymodule.test_config()
mymodule.check_config()
mymodule.Module()
config = None
def test_config():
print config
# this will refer to the value supplied from file main.py
但请注意,模块和主文件中的值不会连接。如果由于任何原因在file main.py
中重新分配配置,则必须再次将该值传递给模块。但是,如果您传递可变值(如dict或list),则可以在file main.py
中修改它,并且值将被共享。
答案 1 :(得分:2)
我不建议使用全局变量,但如果你这样做,那么你应该使用这个设计。需要在config
中定义mymodule
;导入模块后,您可以按照当前设置mymodule.config
的方式设置config
的值。
# file main.py
import sys
import mymodule
mymodule.config = sys.argv[1]
# module.py
# The exact value doesn't matter, as long as we create the name.
# None is good as it conveys the lack of a value; it's part of your
# module's contract, presumably, that a proper value must be assigned
# before you can use the rest of the module.
config = None
def check_config():
# do something with the content of 'config'
class Module(object):
# does something with the content of 'config'
答案 2 :(得分:1)
全局变量几乎永远不是答案。只需允许“库”(module.py
或mymodule.py
中的函数和类,您似乎同时使用它们)来接受参数。所以:
<强> mymodule.py 强>
def check_config(configuration):
pass
class Module(object):
def __init__(self, configuration):
self.config = configuration
class ConfigError(Exception):
pass
然后,当您想在“应用程序”代码中使用它们时:
<强> main.py 强>
import sys
import mymodule
config = sys.argv[1]
if mymodule.check_config(config):
myobject = mymodule.Module(config)
else:
raise mymodule.ConfigError('Unrecognized configuration format.')
答案 3 :(得分:0)
你能描述一下你的app应该做什么吗?因为现在还不清楚,为什么你想要它。 也许环境变量可以帮到你?
顺便说一句,你可以在一个地方(模块)阅读配置文件,并从中导入你需要的所有东西。
<强> config.py 强>
import os
if os.environ['sys'] == 'load_1':
import load_1 as load
i = 12
else:
import load_2 as load
i = 13
<强> main.py 强>
import config
config.load("some_data")
print config.i