我有一个像这样的 py 文件,它出错了。
from world import acme
def make_stuff_happen():
acme.account.foo() # Works
acme.subscription.bar() # FAIL: "module 'object' has no attribute 'subscription'"
make_stuff_happen()
但这行得通!
from world import acme
from world.acme import subscription
def make_stuff_happen():
acme.account.foo() # Works
subscription.bar() # Now this works.
make_stuff_happen()
我只能说 WTF,这可能是什么原因造成的?
acme.account
和 acme.subscription
的行为至少应保持一致。
谢谢!
Update- acme文件夹的文件夹结构:
acme
|-- __init__.py
|-- account.py
|-- catalog.py
|-- core.py
|-- proxy.py
|-- subscription.py
`-- utils.py
而 __init__.py
是完全空白的。
最佳答案
子模块在模块文件夹中的 __init__.py
文件中被引用。 acme
的 __init__.py
中似乎未引用 subscription
。
但是,当您执行 import world.acme.subscription
时,它知道在不与 __init__.py
交谈的情况下继续挖掘该文件夹。
根据您对__init__.py
的描述为空,您应该在__init__.py
中import subscription
。
有关如何设置模块的更多信息,请参阅 documentation .有一个设置声音模块的很好的例子。
关于Python 导入不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3320467/