繁体   English   中英

在Python中的模块/模块作用域中访问变量

[英]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移至可以由多个模块共享的文件。

将数据传递给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直接引用主模块中的值,但这需要循环导入。 应避免循环进口。

为什么要定义它? 它来自其他模块。 在checkargs.py中,您需要执行以下操作:

from myapp import _PARAMETERS

然而:

  1. 您不应该使用_命名,因为这意味着私有/受保护的变量。
  2. 您可能应该将字典从myapp传递到checkargs函数中,而不是将其导入那里。 如果不这样做,那么您将创建一个循环导入,这在逻辑上是可怕的,实际上是行不通的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM