子模块的相对导入

7 投票
3 回答
5015 浏览
提问于 2025-04-17 10:25

在Python中,我想知道怎么做跟下面这个一样的事情:

import http.client

但是我想用相对导入的方式来实现:

from . import http.client
import .http.client

对于当前包中的一个叫http的包,我想通过它的父级名称http.client来访问client模块,就像我用顶级导入时能做到的那样。

3 个回答

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
3

我会去看看相关的 PEP 0328,寻找一些灵感。如果你在 http.__init__.py 文件里,想要访问客户端:

from . import client
3

我觉得你想要的就是这个:

from ..http import client

撰写回答