在 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

但是:

  1. 那么你不应该用 _ 命名它,因为这意味着 private/protected 个变量。
  2. 您可能应该将 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 直接引用主模块中的值,但这需要循环导入。应避免循环导入。