Python条件“module object has no attribute”错误,个人包不同于循环导入问题

2024-09-28 17:06:29 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试使用我创建的包继承权时出现“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

我已经解决了这个问题,但我还是想理解它。谢谢。


Tags: inpyimportechoalphareturnfooinit
1条回答
网友
1楼 · 发布于 2024-09-28 17:06:29

与其使用绝对导入,不如使用亲属导入。

alpha/bravo/init.py

import alpha.bravo.charlie

应该是

import charlie

否则,可能是循环导入。i、 e.如果你从查理那里进口alpha.bravo.charlie,那意味着

alpha/__init__.py
bravo/__init__.py
charlie/__init__.py 

全部都已加载(或者更确切地说,由于它们已加载,因此无法执行此操作)。 那可能会引起你所看到的问题。

相关问题 更多 >