【问题标题】:Updating globals in circular import在循环导入中更新全局变量
【发布时间】:2021-12-10 11:48:47
【问题描述】:

首先,我知道像这样使用全局变量是不好的,但不幸的是,我受到了我无法控制的力量的限制。

我有两个文件:

a.py:

x = {}
from b import *

def main():
  global x
  x[0] = 'hello'
  foo()
  

if __name__ == '__main__':
  main()

b.py:

import a as my_a


def foo():
  print(my_a.x)

我想执行$python a.py 为我打印出更新的字典,但现在它只提供空字典。

有什么方法可以简单地修改此代码,以便foo() 看到对a.py 的更新更改?我也希望避免频繁重新导入。请注意,实际上b.py 实际上是一个很长的文件,我也无法更改其函数定义以添加更多参数。

【问题讨论】:

  • 了解您的global 语句在main 函数中没有任何用处,这一点非常重要
  • @juanpa.arrivillaga 注意到。这是从更复杂的代码中剥离出来的,我将其复制过来,在本示例中可以将其删除。
  • a.py 用于创建 两个 模块,__main__a。尽管来自相同的代码,但它们是不同的,因此my_a.x 没有引用与__main__.x 相同的对象(这是__main__.main() 更新的内容。)
  • 谢谢@chepner,这对理解很有帮助。有什么方法可以从 main 中修改 a 的值吗?我应该将 main 拆分为导入 a.py 的第三个文件吗?
  • 我肯定会将a.py 分成两个文件。它可以简单地从a.py 中剥离if 块,然后将main.py 定义为导入a 并调用a.main()

标签: python circular-dependency globals


【解决方案1】:

你不能简单地做这样的事情:

a.py:

from b import foo

x = {}


def main():
    # global x
    x[0] = 'hello'
    foo(x)


if __name__ == '__main__':
    main()

b.py:

def foo(val):
    print(val)

这样你就摆脱了循环导入。 请注意,来自b import * 是不好的做法,可能会导致namespace pollution。在这个例子中,我们只导入我们需要的东西:from b import foo

【讨论】:

  • 或者更好的是 import b 并使用 b.foo()
  • 我的目标是不修改 b.py 中已经存在的任何函数。我正在尝试尽可能多地将 b.py 视为 API,并且有些函数我无法修改(b.py 也很长)。我将更新问题以反映这一点。
  • @balmy 仍然无法正常工作。 my_a 中没有任何更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多