无法在Mixin中访问全局变量

时间:2013-10-07 09:40:32

标签: python python-3.x

我无法在以下程序中写入全局变量。有人可以给我一个解决方案吗?请注意,我的var变量必须位于Mod2.pyMod3.py

以外的其他文件中

在Mod1.py中

var = 5

在Mod2.py中

from Mod1 import *

def foo(newValue):
  global var
  print('foo: %d' % var)
  var = newValue

print('before: %d' % var)
foo(2)
print('after: %d' % var)

在Mod3.py

from Mod2 import *

foo(3)
print('var: %d' % var)

运行Mod3.py时的结果是

before: 5
foo: 5
after: 2
foo: 2
var: 2

但我希望它是

before: 5
foo: 5
after: 2
foo: 2
var: 3

我不想使用import Modx.py

的解决方案

4 个答案:

答案 0 :(得分:2)

这可能与导入变量并不像你想象的那样:

from Mod1 import var

相同
import Mod1
var = Mod1.var  # this creates a new variable

虽然我无法准确解释您的代码中发生了什么,但我可以说通过将您的导入更改为:

import Mod1

并将var(现在没有全局)称为

Mod1.var

问题解决了。

<强> Mod2.py

import Mod1

def foo(newValue):
  print('foo: %d' % Mod1.var)
  Mod1.var = newValue

print('before: %d' % Mod1.var)
foo(2)
print('after: %d' % Mod1.var)

<强> Mod3.py

import Mod1
from Mod2 import *

foo(3)
print('var: %d' % Mod1.var)

<强>输出:

before: 5
foo: 5
after: 2
foo: 2
var: 3

请花点时间浏览http://www.python.org/dev/peps/pep-0008/;它建议的一些事情:

* avoid wildcard imports (`from <module> import *`) for the various problems they introduce
* module names should be `lowercase`

此外,全局变量通常不被认为是好的,并且总是有一种解决方法;见Why are global variables evil?

答案 1 :(得分:0)

  

我不想使用import Modx.py

的解决方案

那是不可能的。执行所需操作的唯一方法是重新绑定其他模块中的名称,这需要直接导入和访问模块而不是名称。

答案 2 :(得分:0)

你需要说from mod1 import var

为什么?

你的代码说from mod1 import,但如果你看一下,你可以说它是一个未完成的陈述。你想要它导入什么?你必须指定。如果您不想执行更简单的过程import mod1,这将导入所有内容。

答案 3 :(得分:0)

是的,我读过一篇详细阐述mixins邪恶的文章。在我的例子中,包含相互关联的函数(没有使用类)的原始代码太过膨胀,我决定将它们分成2个模块(B.pyC.py)。但是,2访问了几个相同的变量,因此我将这些变量分解为A.py。然后我D.py包含依赖于B.pyC.py中的函数的函数。依赖图如下所示:

      A
    /   \
   B     C
    \   /
      D

(Bottom依赖于顶部)

我没有充分的理由使用mixins,它只是从1开始,我想我想将它们保存在同一名称空间中,甚至分成四个模块。

刚才我想到了为每个变量使用gettersetter函数的解决方案。但我放弃了这个想法,因为它太笨拙了。