困惑的python包作用域

时间:2011-08-12 04:39:38

标签: python package

我是python的新手,对某些行为感到困惑。

我有一个名为d的目录。在这个目录中,我有两个文件:

__init__.py

from d import *

d.py

var = None

def printVar():
  global var
  print "from d: var=%s" % `var`

d上面的目录中,我在python中进行了这种交互:

>>> import d
>>> d.var = 5
>>> d.printVar()
from d: var=None

为什么vard.py的角度来看没有改变?

我的真正目标是完成以下任务:

  • 保持__init__.py
  • 能够更改d.py - 全局变量

如果它有所不同,我的包目录中有多个文件,将这些文件合并到一个文件中是不太理想的。

这样做的可行方法是什么?

3 个答案:

答案 0 :(得分:2)

当你说:

import d

您正在导入包,而不是模块。

只需导入包中的模块d:

>>> from d import d
>>> d.var = 5
>>> d.printVar()
from d: var=5

答案 1 :(得分:0)

我认为全局var的实际名称应为d.d.var(因为它位于包d中的模块d中)

所以你可以

1)设置时只需将其称为d.d.var

2)在d.py

中制作一个制定者

不幸的是,这些可能无效:

a)将其复制到d.var并尝试将其设置在那里(你的问题中有什么) - 这是一个不同的变量

a)将其导入回from __init__ import var(递归导入)

答案 2 :(得分:0)

from X import *

将X中的所有名称复制到本地模块中。因此,修改本地模块不会修改原始模块。

至于你真正想做什么,你可以使用一些python hackery并用你自己的一个替换模块对象,这会重载分配属性的操作。但不要这样做。这需要大量的代码,让你看起来很奇怪。

我建议使用foo客户端代码可以调用的函数。