代码之家  ›  专栏  ›  技术社区  ›  Stefano Borini

是否自动导入子包?

  •  5
  • Stefano Borini  · 技术社区  · 16 年前

    假设你有以下几点

    b
    b/__init__.py
    b/c
    b/c/__init__.py
    b/c/d
    b/c/d/__init__.py
    

    在一些python包中, import b ,您只能获取b中定义的符号。要访问b.c,必须显式 import b.c from b import c . 换句话说,你必须

    import b
    import b.c
    import b.c.d
    print b.c.d
    

    在其他情况下,我看到了所有子包的自动导入。这意味着以下代码不会产生错误

    import b
    print b.c.d
    

    因为 b/__init__.py 负责导入其子包。 我倾向于选择第一个(明确的好于隐含的),而且我总是使用它,但是在某些情况下,第二个比第一个好吗?

    2 回复  |  直到 16 年前
        1
  •  5
  •   Alex Martelli    16 年前

    我喜欢名称空间——所以我认为 import b 应该只知道里面有什么 b 本身(大概在 b/__init__.py )如果有理由在 b.c , b.c.d 或者别的什么,然后 进口B 不应该把它全部拖进去——如果“全部拖进去”确实发生了,我认为这表明名称空间分离可能是一个虚假的开始。当然,即使在标准库中也有示例( import os ,然后您可以使用 os.path.join 类似的),但是它们是古老的,到现在基本上是“祖辈”的东西,从Python打包系统成熟和稳定之前的方式。在新代码中,我会 强烈地 建议包裹应该 当您导入它时,拖动它的子包以供骑乘使用。(做 import this 在python提示下,思考它显示的最后一行;-)。

        2
  •  0
  •   przemo_li    16 年前

    __all__ =[变量、函数、类]

    在包B中使用上面的语法 __init__.py 自动加载dict.:)中列出的内容

    推荐文章