包内模块的相对导入

2024-10-01 00:24:01 发布

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

我怎样才能使一个包中的模块.adipiscing.lorem_ipsum可用,以使干净地使用导入系统,并且不让无关的名称不被使用?在

给定代码基:

foo/
    consecteur.py
    adipiscing/
        lorem_ipsum.py

consecteur模块需要访问adipiscing.lorem_ipsum模块。在

这就是我想做的:

^{pr2}$

这行不通;from . import adipiscing.lorem_ipsum是一个语法错误。在

不满足的选项

使用隐式相对导入

# consecteur.py

import adipiscing.lorem_ipsum

dolor = adipiscing.lorem_ipsum.dolor_sit_amet()

这不必要地混淆了adipiscing.lorem_ipsum是绝对导入还是相对导入。当导入是相对的时,代码应该是显式的。在

将模块从其命名空间包中拉出

# consecteur.py

from .adipiscing import lorem_ipsum

dolor = lorem_ipsum.dolor_sit_amet()

这将丢失通过读取adipiscing.lorem_ipsum所传递的有价值的信息,尤其是如果lorem_ipsum是一个通用词,需要由adipiscing包命名空间将其上下文化。在

使用损坏的名称导入

# consecteur.py

from .adipiscing import lorem_ipsum as adipiscing_lorem_ipsum

dolor = adipiscing_lorem_ipsum.dolor_sit_amet()

这在视觉上是令人困惑的;期望adipiscing.lorem_ipsum的人可以很容易地键入希望它正常工作的名称,但该名称不可用。使用一个令人困惑的相似名称并不是一个好的解决方案;使用一个不同的名称也不是一个好的解决方案,因为整个目的是使adipiscing.lorem_ipsum可用。在

如果包名或模块名中的一个或两个名称实际上已经有下划线,那么这也是不明确的。如果一个下划线代表一个点,那么这个点和一个实际上包含一个下划线的名称是无法区分的。在

导入包,尝试使用模块

# consecteur.py

from . import adipiscing

dolor = adipiscing.lorem_ipsum.dolor_sit_amet()

这是一个AttributeError,因为adipiscing.lorem_ipsum现在不可用;模块不能仅仅通过导入包含的包就自动可用。在

导入模块,但从不使用其名称eh3>
# consecteur.py

from . import adipiscing
from .adipiscing import lorem_ipsum

dolor = adipiscing.lorem_ipsum.dolor_sit_amet()

这次黑客攻击成功了,但是import语句from .adipiscing import lorem_ipsum声明我们将使用空的lorem_ipsum名称。在

因为这不是真的,静态代码检查程序将(正确地)抱怨未使用的导入。我同意这些代码检查程序,所以我不想让警告保持沉默;我希望避免黑客攻击,同时仍然可以使用adipiscing.lorem_ipsum名称。在

那么,我如何使用显式相对导入(explicit relative import),而不使用未使用的导入(import),如何使adipiscing.lorem_ipsum名称对代码可用?在


Tags: 模块代码frompyimport名称空间命名
2条回答

目前似乎没有办法使用Python导入系统来实现这一点。在

Python的解释器不支持所需的语法。但是您可以使用as作为一种解决方法,“将模块从其命名空间包中拉出”。例如:

from .lorem import ipsum as lorem_ipsum

dolor = lorem_ipsum.dolor_sit_amet()

这样做,您将得到完整的上下文,即lorem's ipsum

相关问题 更多 >