一个模块递归地导入它的子模块是一个好的实践吗?

2024-10-01 07:10:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到了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']

所以客户端代码只需执行以下操作:

^{pr2}$

而不是:

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

哪一个是最佳实践TM?递归导入有什么问题吗?还是应该坚持默认行为?违约行为的基本原理是什么?在


Tags: 模块代码frompyimport客户端initdef
2条回答

这些做法是平等的。在

第一个例子期望两个子模块必须一起使用,这样在用户代码中总是有两个导入。你给他们提供了一条捷径。在

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

这取决于模块的使用情况。如果子模块只是一个单例对象,而这些对象恰好是以模块的形式编写的,而不是像Java一样具有所有静态方法的类,那么递归导入可能是不错的。另一方面,如果您的模块是几个相关子模块的分组(例如,stdlibhtml模块),那么您需要显式的子模块导入。在

一般来说,递归导入设置表示“此模块的任何客户机都将始终需要所有这些”。考虑一下您的模块(以及其他模块,具体情况)是否正确,然后从那里开始。在

相关问题 更多 >