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

在Python中访问模块/模块范围中的变量,python,scope,global,Python,Scope,Global,我想使用我在模块内部的应用程序中定义的变量 文件夹结构: myapp.py 模块/checkargs.py modules/init.py(一个空文件) 主应用程序(myapp.py): checkargs.py: def checkargs(argv): global _PARAMETERS; #more Python insanity here 错误: NameError:未定义全局名称“\u参数” 为什么要定义它?它来自不同的模块。在checkargs.py中,您需要

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

文件夹结构:

myapp.py

模块/checkargs.py

modules/init.py(一个空文件)

主应用程序(myapp.py):

checkargs.py:

def checkargs(argv):

    global _PARAMETERS;

    #more Python insanity here
错误:

NameError:未定义全局名称“\u参数”


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

from myapp import _PARAMETERS
然而:

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

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

    from myapp import _PARAMETERS
    
    然而:

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

  • 一般来说,您应该避免这种编程风格。模块不应依赖于在其他模块中定义的全局变量。更好的解决方案是将
    \u参数
    传递到
    检查参数
    ,或将
    \u参数
    移动到可由多个模块共享的文件中

    将数据传递给checkargs 一般来说,依赖全局变量是个坏主意。也许最好的解决方案是将
    参数
    直接传递到
    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
    直接引用主模块中的值,但这需要循环导入。应该避免循环导入。

    一般来说,应该避免这种编程风格。模块不应依赖于在其他模块中定义的全局变量。更好的解决方案是将
    \u参数
    传递到
    检查参数
    ,或将
    \u参数
    移动到可由多个模块共享的文件中

    将数据传递给checkargs 一般来说,依赖全局变量是个坏主意。也许最好的解决方案是将
    参数
    直接传递到
    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依赖于checkargs,checkargs依赖于myappYes,我看到您解决了这个问题。然而,你的第一句话是“你需要做”。“需要”在这里是一个非常强烈的词。事实上,OP绝对不需要这样做。他们能做到,但这不是个好主意。也许这是一件好事,但看到专家说“你需要做X”是人类的天性,所以你就去做。我把这句话软化了一点…:)这给了你循环依赖,这应该避免-myapp依赖于checkargs,checkargs依赖于myappYes,我看到你解决了这个问题。然而,你的第一句话是“你需要做”。“需要”在这里是一个非常强烈的词。事实上,OP绝对不需要这样做。他们能做到,但这不是个好主意。也许这是一件好事,但看到专家说“你需要做X”是人类的天性,所以你就去做。我把这句话软化了一点…:)