0

封装结构:

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

(两个__init__.pys 都是空的。)当我这样做时,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

4

3 回答 3

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']
于 2013-06-07T02:59:26.240 回答
0

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

您的帖子表明它引入了草地模块,但我们无法看到您系统上的所有内容。

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

于 2013-06-07T02:59:35.037 回答
0

我自己还在想办法,但我相信你需要明确告诉包的一部分,在使用通配符chip时 Python 应该导入哪些子模块。*在文件夹__init__.pychip,添加以下内容:

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

没有这个添加,我得到一个NameErroron grass。通过此更改,没有错误。

于 2013-06-07T03:09:09.207 回答