[英]Accessing variable in module / Module scope in Python
我想在模块内的应用程序中使用定义的变量。
文件夹结构:
myapp.py
modules / checkargs.py
modules / init .py(一个空文件)
主应用程序(myapp.py):
_PARAMETERS = {
'stuff': 'here'
}
from modules.checkargs import checkargs
if __name__ == "__main__":
checkargs(sys.argv[1:])
checkargs.py:
def checkargs(argv):
global _PARAMETERS;
#more Python insanity here
错误:
NameError:全局名称“ _PARAMETERS”未定义
通常,您应该避免这种编程风格。 模块不应依赖于其他模块中定义的全局变量。 更好的解决方案是将_PARAMETERS
传递到checkargs
,或将_PARAMETERS
移至可以由多个模块共享的文件。
一般来说,依靠全局变量是一个坏主意。 也许最好的解决方案是将PARAMETERS
直接传递到您的checkargs
函数中。
# checkargs.py
def checkargs(argv, parameters):
...
# myapp.py
if __name__ == "__main__":
checkargs(sys.argv[1:], _PARAMETERS)
如果您有要在模块之间共享的数据,则可以将该数据放在每个其他模块导入的第三个模块中:
# modules/shared.py
PARAMETERS = {...}
# myapp.py
from modules.shared import PARAMETERS
# checkargs.py
from modules.shared import PARAMETERS
还有其他解决方案,尽管我认为上述两种解决方案是最好的。 例如,您的主程序可以将参数复制到checkargs
模块,如下所示:
# myapp.py
import checkargs
checkargs._PARAMETERS = _PARAMETERS
...
您也可以让checkargs
直接引用主模块中的值,但这需要循环导入。 应避免循环进口。
为什么要定义它? 它来自其他模块。 在checkargs.py中,您需要执行以下操作:
from myapp import _PARAMETERS
然而:
_
命名,因为这意味着私有/受保护的变量。 myapp
传递到checkargs
函数中,而不是将其导入那里。 如果不这样做,那么您将创建一个循环导入,这在逻辑上是可怕的,实际上是行不通的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.