在Python中,目录模块的u init_u.py这样做是不是一个坏主意?

2024-05-16 23:00:37 发布

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

我有一个包含多个子目录的包,其中包含__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",在另一个地方作为模块名。在


Tags: 模块文件pyimport文件夹init地方sys
2条回答

有更简单的方法从._implementation子模块设置__all__;设置__all__否则可以:

from ._implementation import *
from ._implementation import __all__

这只需导入__all__,并将其绑定到本地模块命名空间__all__。在

比Martijn Pieters的回答还要简单:

如果您将'__all__'包含在._implementation__all__列表中,它将由您的from ._implementation import *行自动导入。在


至于你的主要问题,这是不是个坏主意

好吧,这取决于你在做什么。这基本上使您的包看起来与它的_implementation模块完全相同。如果这就是你要做的,那没关系……但是在这种情况下,为什么不先把_implementation移到{}呢?在

如果您试图将多个模块合并为一个模块,您可能需要将它们的所有__all__列表添加到单个模块中。stdlib有这样的例子,比如collections,通常的模式是:

from collections.abc import *
import collections.abc
__all__ += collections.abc.__all__

这似乎有点冗长,但它肯定是清楚的。在


从你编辑的问题来看,我认为你所做的是合理的,与collections完全相同,最清晰和最惯用的解决方案是做同样的事情,但是用=而不是{}(因为你只是复制一个列表,而不是将多个列表添加到一起)。在

但是,既然如此:

^{pr2}$

…相当于(与您的用例非常接近):

from foo import bar

……Martijn Pieters的回答显然很简单:

from ._implementation import *
from ._implementation import __all__

所以,我会这么做的。在

相关问题 更多 >