【问题标题】:Accessing variable in module / Module scope in Python在 Python 中访问模块/模块范围中的变量
【发布时间】:2015-11-20 15:51:42
【问题描述】:

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

文件夹结构:

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”

【问题讨论】:

    标签: python scope global


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      from myapp import _PARAMETERS
      

      但是:

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

      【讨论】:

      • 这给了你循环依赖,应该避免 - myapp 依赖于 checkargs,而 checkargs 依赖于 myapp
      • 是的,我看到你解决了这个问题。但是,您的第一句话说“您需要 做”。 “需要”在这里是一个非常强烈的词。事实上,OP 绝对不需要需要 这样做。他们可以做到,但这是个坏主意。也许这会让人毛骨悚然,但看到专家说“你需要做 X”,然后你就去做,这是人类的天性。
      • 我稍微软化了这个说法...... :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多