8

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

4

2 回答 2

3

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

一般来说,递归导入设置说“这个模块的任何客户端总是想要所有这些”。考虑这是否适用于您的模块(以及其他模块,具体情况),然后从那里开始。

于 2012-05-18T04:58:07.590 回答
0

这些做法是平等的。

第一个示例期望两个子模块必须一起使用,因此用户代码中总是有两个导入。他们为您提供了一条捷径。

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

于 2012-05-18T05:11:24.443 回答