我有以下目录结构:
funniest/
setup.py
funniest/
__init__.py
ModuleA.py
ModuleB.py
# __init__.py
from numba import jit
from .ModuleA import ClassA
# ModuleA.py
import funniest.ModuleB
class ClassA():
pass
# ModuleB.py
@jit
def f():
pass
但是,导入模块时,收到错误消息:
>>> import funniest
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest /__init__.py", line 2, in <module>
from .ModuleA import ClassA
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest /ModuleA.py", line 1, in <module>
import funniest.ModuleB
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest/ModuleB.py", line 1, in <module>
@jit
NameError: name 'jit' is not defined
我无法理解为什么会发生这种情况,因为首先执行__init__.py
时,首先要做的是导入from numba import jit
。那么,为什么jit
在f
中的ModuleB
函数中没有定义?
答案 0 :(得分:6)
您在funniest/__init__.py
中输入的导入仅在您执行import funniest
时导入,而不是在子模块中自动导入。因此ModuleB
不了解jit
。
您需要做的是将from numba import jit
从__init__.py
移至ModuleB.py
。
答案 1 :(得分:3)
ModuleB
内部未知名称import
。 Python导入不像C / C ++那样工作,代替import funniest
推出代码。一个新模块创建一个新的命名空间,里面有一个地图 - 一个包含函数,类等的地图。
因此,当您执行{..., funniest: {}, ...}
时,您在当前命名空间中创建了新的地图条目,例如:funniest
。导入jit
后,您导入了ClassA
和funniest
,因此从导入funniest: {jit: {..}, ClassA: {...}}
模块的位置开始,您可以访问此类地图:ModuleA
。
在导入ModuleB
的{{1}}中,因此在ModuleA
中,您有一个内容为ModuleB:{...}
的新变量ModuleB
。但是在这里你没有看到funniest
地图 - 它在层次结构的其他层面。
在ModuleB
中,您看不到funniest
和ClassA
地图(名称空间 - 以及您喜欢称之为的内容;)。)