尝试使用我创建的包继承权时出现“module object has no attribute…”错误。这个错误让人想起循环导入(即模块a导入b和模块b导入a)时的错误,但我在这里看不到这个问题。我读过很多类似错误的帖子,但没有一个我认为很合适的解释。
这在Python2.7.1和Python2.4.3中都可以看到。
我将其简化为以下示例:
考虑以下继承权(见下面的代码):
alpha
alpha/__init__.py
alpha/bravo
alpha/bravo/__init__.py
alpha/bravo/charlie.py
alpha/bravo/delta.py
alpha/bravo/echo.py
charlie导入echo模块,然后导入delta。如果alpha/bravo/uu init_uuu.py(类似alpha/uu init_uuu.py)本质上是空白的,脚本可以执行以下操作:
import alpha.bravo.charlie
如果我尝试在alpha/bravo/\uu init_uuuuuuuuy.py中导入alpha.bravo.charlie(考虑到我可以在那里显示相关的类/方法,而脚本将执行'import alpha.bravo'),就会出现问题。
代码:
阿尔法/初始
(blank)
阿尔法/布拉沃/uuu init_uuuu.py
import alpha.bravo.charlie
阿尔法/布拉沃/查理.py
import alpha.bravo.echo
def charlie_foo(x): return str(x)
def charlie_bar(x): return alpha.bravo.echo.echo_biz()
阿尔法/布拉沃/德尔塔.py
def delta_foo(x): return str(x)
阿尔法/布拉沃/回声.py
import alpha.bravo.delta
print alpha.bravo.delta.delta_foo(1)
def echo_biz(): return 'blah'
如果我尝试:
python -c 'import alpha.bravo'
我得到:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/kmkc980/svn/working/azcif/python/lib/alpha/bravo/__init__.py", line 1, in <module>
import alpha.bravo.charlie
File "/home/kmkc980/svn/working/azcif/python/lib/alpha/bravo/charlie.py", line 1, in <module>
import alpha.bravo.echo
File "/home/kmkc980/svn/working/azcif/python/lib/alpha/bravo/echo.py", line 2, in <module>
print alpha.bravo.delta.delta_foo(1)
AttributeError: 'module' object has no attribute 'bravo'
但是,如果我在alpha/bravo/\uu init\uuuu.py中注释掉导入行,那么一切看起来都正常:
python -c 'import alpha.bravo'
python -c 'import alpha.bravo.charlie'
1
此外,如果我使用上面相同的代码(包括alpha/bravo/\uu in it\uuuu.py中的导入行),但是编辑所有内容以排除层次结构的“alpha”级别,那么它似乎可以正常工作。
所以等级制度现在只是:
bravo
bravo/__init__.py
bravo/charlie.py
bravo/delta.py
bravo/echo.py
我把所有的“alpha.bravo.*”改成“bravo.*”
那没问题:
python -c 'import bravo'
1
我已经解决了这个问题,但我还是想理解它。谢谢。
与其使用绝对导入,不如使用亲属导入。
即
alpha/bravo/init.py
应该是
否则,可能是循环导入。i、 e.如果你从查理那里进口alpha.bravo.charlie,那意味着
全部都已加载(或者更确切地说,由于它们已加载,因此无法执行此操作)。 那可能会引起你所看到的问题。
相关问题 更多 >
编程相关推荐