如何以干净利用导入系统的方式制作包内.adipiscing.lorem_ipsum
模块,不会遗漏任何无关名称< /强>
给出代码库:
foo/
consecteur.py
adipiscing/
lorem_ipsum.py
consecteur
模块需要访问adipiscing.lorem_ipsum
模块。
这就是我想要做的事情:
# consecteur.py
from . import adipiscing.lorem_ipsum
dolor = adipiscing.lorem_ipsum.dolor_sit_amet()
这不起作用; from . import adipiscing.lorem_ipsum
是一个SyntaxError。
# 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
现在不可用;只需导入包含的包,模块就不会自动可用。
# consecteur.py
from . import adipiscing
from .adipiscing import lorem_ipsum
dolor = adipiscing.lorem_ipsum.dolor_sit_amet()
此hack成功,但import语句from .adipiscing import lorem_ipsum
声明我们将使用裸lorem_ipsum
名称。
由于这不是真的,静态代码检查器会(正确地)抱怨未使用的导入。我同意那些代码检查器,所以我不只是想让警告沉默;我想避免黑客攻击,仍然可以获得adipiscing.lorem_ipsum
名称。
那么,我如何使用显式相对导入,使用adipiscing.lorem_ipsum
名称,没有未使用的导入
答案 0 :(得分:1)
Python的解释器不支持您想要的语法。但是,您可以使用as
作为&#34;将模块从其命名空间包中拉出来的解决方法&#34; 。例如:
from .lorem import ipsum as lorem_ipsum
dolor = lorem_ipsum.dolor_sit_amet()
执行此操作,您将获得lorem's ipsum
答案 1 :(得分:0)
目前似乎无法使用Python导入系统执行此操作。