我想使用我在模块中的应用程序中定义的变量。
文件夹结构:
myapp.py
模块/ 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”
答案 0 :(得分:3)
一般来说,你应该避免这种编程风格。模块不应该依赖于其他模块中定义的全局变量。更好的解决方案是将_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
直接引用主模块中的值,但这需要循环导入。应避免循环进口。
答案 1 :(得分:0)
为什么要定义?它来自不同的模块。在checkargs.py中,您需要执行以下操作:
from myapp import _PARAMETERS
然而:
_
来命名它,因为这意味着私有/受保护的变量。myapp
传递到checkargs
函数,而不是将其导入。{如果你不这样做,你就会创建一个循环导入,这在逻辑上很糟糕,并且实际上并不起作用。