我怎样才能使一个包中的模块.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
现在不可用;模块不能仅仅通过导入包含的包就自动可用。在
# 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
名称对代码可用?在
目前似乎没有办法使用Python导入系统来实现这一点。在
Python的解释器不支持所需的语法。但是您可以使用
as
作为一种解决方法,“将模块从其命名空间包中拉出”。例如:这样做,您将得到完整的上下文,即
lorem's ipsum
相关问题 更多 >
编程相关推荐