在Python中访问模块/模块范围中的变量

时间:2015-11-20 15:51:42

标签: python scope global

我想使用我在模块中的应用程序中定义的变量。

文件夹结构:

  

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”

2 个答案:

答案 0 :(得分:3)

一般来说,你应该避免这种编程风格。模块不应该依赖于其他模块中定义的全局变量。更好的解决方案是将_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直接引用主模块中的值,但这需要循环导入。应避免循环进口。

答案 1 :(得分:0)

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

from myapp import _PARAMETERS

然而:

  1. 你不应该用_来命名它,因为这意味着私有/受保护的变量。
  2. 您应该将字典从myapp传递到checkargs函数,而不是将其导入。{如果你不这样做,你就会创建一个循环导入,这在逻辑上很糟糕,并且实际上并不起作用。