Python:包中有些东西可见,有些则没有

时间:2013-06-07 02:08:31

标签: python package visibility

包结构:

World\
    __init__.py
    Chip\
        __init__.py
        grass.py
        snow.py
        water.py

(两个__init__.py都是空的。) 当我from world.chip import *时,我可以使用grass.Grass,但不能snow.Snow。这是为什么?

MUSIC = {
         grass.Grass: "mus_grass",
         snow.Snow: "mus_snow",
         water.Water: "mus_water",
         "default": "mus_grass"
         }

NameError: name 'snow' is not defined

3 个答案:

答案 0 :(得分:0)

不是正确的方法,但你可以强制加载你的包裹:

# in your world/chip/__init__.py
from grass import *
from snow import *
from water import *

然后,当您导入Chip模块时,您将加载所有其他包:

# Your structure dirs
$ tree
.
`-- world
    |-- __init__.py
    `-- chip
        |-- __init__.py
        |-- grass.py
        |-- snow.py
        |-- water.py

shell

$ python
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help']
>>> from world.chip import *
>>> dir()
['Grass', 'Snow', 'Water', '__builtins__', '__doc__', '__name__', '__package__', 'grass', 'help', 'snow', 'water']

答案 1 :(得分:0)

如果__init__.py为空,则没有理由期望from world.chimp import *会带来雪或草模块。

你的帖子表明它带来了草模块,但我们看不到你系统上的每一个。

是否有world/__init__.py它可以有from chimp import grass来解释行为。即使py文件正如您所描述的那样,您也可能有潜伏的pyc。

答案 2 :(得分:0)

我仍在自己解决这个问题,但我相信你需要明确告诉包的chip部分Python在使用*通配符时应该导入哪些子模块。在__init__.py文件夹的chip内,添加以下内容:

__all__ = ["grass", "snow", "water"]

如果没有此添加,我会在NameError上获得grass。通过此更改,没有错误。