子模块的相对导入
在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