我有一个包含多个子目录的包,其中包含__init__.py
文件。这些文件执行检查和初始化作业。在
现在我在这些文件夹中还有一个文件,它不应该由import
直接引用,因为它依赖于在其各自的__init__.py
中执行的健全性检查。让我们把这些称为“隐藏的模块”—作为惯例,我使用下划线使其变得明显。在
在我的__init__.py
(同一个文件夹中有一个_implementation.py
)内执行以下操作是不是一个坏主意:
import os, sys
if sanity_check_successful:
from ._implementation import *
__all__ = sys.modules[__name__ + "._implementation"].__all__
这个想法应该很清楚,每当健全性检查失败时,我都试图在包中的每个模块级别提供有意义的错误信息。在
这是个坏主意吗,即从“隐藏模块”复制__all__
数组?如果是,为什么还有更好的选择?在
加分:这两行有没有更简洁的写法?公司名称:
^{pr2}$尤其让我感到刺痛的是,我必须在一个地方使用字符串"._implementation"
,在另一个地方作为模块名。在
有更简单的方法从
._implementation
子模块设置__all__
;设置__all__
否则可以:这只需导入
__all__
,并将其绑定到本地模块命名空间__all__
。在比Martijn Pieters的回答还要简单:
如果您将
'__all__'
包含在._implementation
的__all__
列表中,它将由您的from ._implementation import *
行自动导入。在至于你的主要问题,这是不是个坏主意
好吧,这取决于你在做什么。这基本上使您的包看起来与它的}呢?在
_implementation
模块完全相同。如果这就是你要做的,那没关系……但是在这种情况下,为什么不先把_implementation
移到{如果您试图将多个模块合并为一个模块,您可能需要将它们的所有
__all__
列表添加到单个模块中。stdlib有这样的例子,比如collections
,通常的模式是:这似乎有点冗长,但它肯定是清楚的。在
从你编辑的问题来看,我认为你所做的是合理的,与}(因为你只是复制一个列表,而不是将多个列表添加到一起)。在
collections
完全相同,最清晰和最惯用的解决方案是做同样的事情,但是用=
而不是{但是,既然如此:
^{pr2}$…相当于(与您的用例非常接近):
……Martijn Pieters的回答显然很简单:
所以,我会这么做的。在
相关问题 更多 >
编程相关推荐