【问题标题】:How do I update a global package variable in Python at run time [duplicate]如何在运行时更新 Python 中的全局包变量 [重复]
【发布时间】:2017-06-15 08:42:23
【问题描述】:

我正在努力定义一个供包中所有模块使用的全局包变量。 我有这个代码:

# my_module.py
from .__main__ import GLOBAL_VAR

def print_global():
    print(GLOBAL_VAR)


# __main__.py
from my_package import my_module
GLOBAL_VAR = ''

def main():
    global GLOBAL_VAR
    GLOBAL_VAR = 'myvalue'
    my_module.print_global()

if __name__ == '__main__':
    main()

我希望my_module.print_global() 打印myvalue,但它打印的是一个空字符串(初始值)。 我还尝试在main() 中的GLOBAL_VAR 声明之后导入模块,但没有帮助。

您能否告知我如何从main() 重新定义GOBAL_VAR 并使其可用于包中的所有子模块?我也会接受任何其他选项,而不是使用 global 关键字。

编辑:建议的类似问题仅部分回答了这个问题。没有关于重新定义全局变量的问题。

【问题讨论】:

  • 你为什么需要那个烂摊子?为什么不只是GLOBAL_VAR = 'myvalue'
  • @AzatIbrakov 我希望一个变量可用于包中的所有模块,并且我不想将它作为附加参数传递给所有函数/对象。有什么建议吗?
  • 你的变量来自哪里?从环境/文件/互联网/数据库?你需要读一遍吗?
  • 如何创建带有全局变量的包?例如。 settings.pyglobals.py。然后在你的包中做import globals 并使用在那里定义的任何变量,例如globals.GLOBAL_VAR.
  • 我很惊讶这完全有效。首先,您有循环导入,A 导入 B 和 B 导入 A - 其次,您尝试导入一个变量,这在 python 中也无法完成。您是否尝试执行您发布的代码?

标签: python


【解决方案1】:

我不确定这是不是正确的做法,但我就是这样做的:

  1. 按照@Nearoo 的建议,将GLOBAL_VAR 移至单独的文件settings.py 以消除循环导入。

  2. main() 中以我想要的方式重新定义settings.GLOBAL_VAR

  3. 然后才导入my_module

同样,这里的问题是我最初不知道变量值,需要在运行时定义它以供所有模块使用。

这就是代码现在的样子:

# settings.py
GLOBAL_VAR = ''


# my_module.py
from .settings import GLOBAL_VAR

def print_global():
    print(GLOBAL_VAR)


# __main__.py
from my_package import settings

def main():
    settings.GLOBAL_VAR = 'myvalue'

    from my_package import my_module
    my_module.print_global()

if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2020-10-02
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多