在Python中访问模块/模块范围中的变量
我想使用我在模块内部的应用程序中定义的变量 文件夹结构: myapp.py 模块/checkargs.py modules/init.py(一个空文件) 主应用程序(myapp.py): checkargs.py:在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中,您需要
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”是人类的天性,所以你就去做。我把这句话软化了一点…:)