代码之家  ›  专栏  ›  技术社区  ›  adamJLev

python导入不一致行为

  •  3
  • adamJLev  · 技术社区  · 14 年前

    我有一个这样的文件,出错了。

    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 .

    谢谢!

    更新-Acme文件夹的文件夹结构:

    acme
    |-- __init__.py
    |-- account.py
    |-- catalog.py
    |-- core.py
    |-- proxy.py
    |-- subscription.py
    `-- utils.py
    

    __init__.py 完全空白。

    1 回复  |  直到 10 年前
        1
  •  6
  •   Donald Miner    14 年前

    子模块在 __init__.py 文件在模块文件夹中。看来 subscription 未在中引用 acme π介子 .

    但是,当你这样做的时候 import world.acme.subscription ,它知道不跟人说话就去翻那个文件夹 π介子 .

    根据你的描述 π介子 因为是空的,你应该 import subscription 在里面 π介子 .

    有关如何设置模块的详细信息,请参见 documentation . 有一个设置声音模块的很好例子。