模块递归导入其子模块是否是一种好的做法



我看到了Python模块的常见模式。有时__init__.py导入其子模块:

例如

mymod/
    __init__.py:
        from . import subm1, subm2
        __all__ = ['subm1', 'subm2']
    subm1.py:
        def subf1():
            ...
        __all__ = ['subf1']
    subm2.py:
        def subf2():
            ...
        __all__ = ['subf2']

因此,客户端代码只需要执行以下操作:

import mymod
mymod.subm1.subf1()
mymod.subm2.subf2()

而不是:

import mymod.subm1
import mymod.subm2
mymod.subm1.subf1()
mymod.subm2.subf2()

哪一个是最佳实践TM?递归导入有什么问题,还是我应该坚持默认行为?默认行为的理由是什么?

这取决于模块的使用情况。如果子模块只是碰巧作为模块编写的单例对象,而不是具有具有全静态方法的类似 Java 的类,则递归导入可能没问题。另一方面,如果您的模块对几个相关的子模块进行分组(例如,参见 stdlib html模块(,则需要显式子模块导入。

通常,递归导入设置显示"此模块的任何客户端将始终需要所有这些"。考虑您的模块(以及其他模块,逐个情况而定(是否如此,然后从那里开始。

这些做法是平等的。

第一个示例期望两个子模块必须一起使用,因此用户代码中将有两个导入。你给他们一个捷径。

第二个期望子模块是独立的块,仅与其他模块间接交互。

相关内容

最新更新