在 Python 中访问模块/模块范围内的变量
Accessing variable in module / Module scope in Python
我想使用我在模块内部的应用程序中定义的变量。
文件夹结构:
myapp.py
modules/checkargs.py
modules/init.py (an empty file)
主应用程序(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: global name '_PARAMETERS' is not defined
为什么要定义?它来自不同的模块。在 checkargs.py 内,您需要做:
from myapp import _PARAMETERS
但是:
- 那么你不应该用
_
命名它,因为这意味着 private/protected 个变量。
- 您可能应该将
myapp
中的字典传递给 checkargs
函数,而不是将其导入那里。如果你不这样做,你就是在创建一个循环导入,这在逻辑上很糟糕并且实际上不起作用。
一般来说,您应该避免这种编程风格。模块不应依赖于其他模块中定义的全局变量。更好的解决方案是将 _PARAMETERS
传递给 checkargs
,或者将 _PARAMETERS
移动到可以由多个模块共享的文件。
正在将数据传递给 checkargs
一般来说,依赖全局变量是个坏主意。也许最好的解决方案是将 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
直接引用主模块中的值,但这需要循环导入。应避免循环导入。
我想使用我在模块内部的应用程序中定义的变量。
文件夹结构:
myapp.py
modules/checkargs.py
modules/init.py (an empty file)
主应用程序(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: global name '_PARAMETERS' is not defined
为什么要定义?它来自不同的模块。在 checkargs.py 内,您需要做:
from myapp import _PARAMETERS
但是:
- 那么你不应该用
_
命名它,因为这意味着 private/protected 个变量。 - 您可能应该将
myapp
中的字典传递给checkargs
函数,而不是将其导入那里。如果你不这样做,你就是在创建一个循环导入,这在逻辑上很糟糕并且实际上不起作用。
一般来说,您应该避免这种编程风格。模块不应依赖于其他模块中定义的全局变量。更好的解决方案是将 _PARAMETERS
传递给 checkargs
,或者将 _PARAMETERS
移动到可以由多个模块共享的文件。
正在将数据传递给 checkargs
一般来说,依赖全局变量是个坏主意。也许最好的解决方案是将 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
直接引用主模块中的值,但这需要循环导入。应避免循环导入。