包结构:
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
答案 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
。通过此更改,没有错误。