在包

时间:2016-11-24 00:16:57

标签: python namespaces python-import

如何以干净利用导入系统的方式制作包内.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名称,没有未使用的导入

2 个答案:

答案 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导入系统执行此操作。