子模块的相对导入

7
在Python中,我如何执行以下操作的等效操作:
import http.client

但是使用相对导入:

from . import http.client
import .http.client

针对当前包中的http模块,我希望可以通过其父级名称http.client访问client模块,就像进行顶层导入一样。

3个回答

3

如果您需要灵感,可以查看相关的PEP 0328。如果您在http.__init__.py中,并且想要访问客户端:

from . import client

3
我认为你需要的是这个:

我认为您需要的是这个:

from ..http import client

3
您需要使用以下命令导入它: from . import http 然而,此时您尚未加载http.client模块,因此无法访问它:
>>> http.client
AttributeError: 'module' object has no attribute 'client'

有各种方法来解决这个问题。最简单的方法是在http/__init__.py中进行操作。

from . import client

您可以做的另一件事情是

import types
http = types.ModuleType('http')

from .http import client
http.client = client

如果修改 http/__init__.py 不现实,您也可以这样做:

但是,由于我假设这是为了某种原因提供 http.client 的即插即用替代品,我建议您按照以下方式操作:

try:
    from .http import client
except ImportError:
    from http import client

然后始终使用“client”这个名称。这绝对是最简单、最美观的解决方案。

或者,如果您不想使用“client”作为名称:

try:
    from .http import client as http_client
except ImportError:
    from http import client as http_client

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接