模块以递归方式导入其子模块是一种好习惯吗?

时间:2012-05-18 04:32:43

标签: python

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

E.g。

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 ?递归导入有什么问题,还是应该坚持默认行为?默认行为的基本原理是什么?

2 个答案:

答案 0 :(得分:3)

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

通常,递归导入设置会说“此模块的任何客户端都将始终需要所有这些”。考虑是否对您的模块(以及其他模块,逐个案例)都这样,并从那里开始。

答案 1 :(得分:0)

这些做法是平等的。

第一个例子预计两个子模块必须一起使用,因此在用户代码中总会有两个导入。他们提供了一条捷径。

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