【问题标题】:Self import of subpackages or not?是否自行导入子包?
【发布时间】:2009-12-01 17:33:28
【问题描述】:

假设你有以下

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.cfrom 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 负责导入其子包。 我倾向于更喜欢第一个(显式优于隐式),并且我总是使用它,但是是否存在第二个优于第一个的情况?

【问题讨论】:

  • 您不必在import b.c.d 之前先import b 然后import b.c。 (我倾向于写from b.c import d 以在简洁和明确之间取得平衡。)

标签: python packages


【解决方案1】:

我喜欢命名空间——所以我认为import b 应该只获取b 本身中的内容(大概在b/__init__.py 中)。如果有理由将b.cb.c.d 或其他任何功能中的其他功能隔离开来,那么 import b 不应将其全部拖入——如果“全部拖入”确实发生了,我认为这表明命名空间分离可能是一个虚假的开始。当然,即使在标准库中也有示例(import os,然后您可以使用os.path.join 等),但它们很古老,现在基本上是 Python 打包系统成熟之前的“祖父”事物并且稳定。在新代码中,我强烈建议一个包在导入时不要拖拽它的子包。 (在 Python 提示符下执行 import this 并考虑它显示的最后一行;-)。

【讨论】:

    【解决方案2】:

    __all__ = [你的变量、函数、类]

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

    【讨论】:

    • 这会影响from b import *,而不是import b; b.c.d
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多