在Python中如何使用"from A import B.C"?

1 投票
3 回答
1560 浏览
提问于 2025-04-18 04:52

在Python中,可以明确地导入带点的子模块:

import os.path

这样就可以使用os.path了。

现在,有没有简单的方法可以对更深层次的子模块做同样的事情呢?下面的代码(这段代码是不能用的)展示了我想要的效果:

from A import B.C
from A import B.D

(from A import B并不会导入B.CB.D,而我需要使用的是模块A.B)。我想这样做是因为:

  • 我不想让主命名空间里充满CDfrom A.B import C, D),因为它们的名字不太具体。
  • 我希望把这些子子模块保留在B的命名空间里(原因是一样的)。

一种解决方案是这样做:

from A import B
from A.B import C, D
del C, D

这样就会加载并定义B.CB.D。不过,这种做法有几个问题:(1) 相当不寻常,(2) 有点晦涩(定义B.CB.D的副作用),(3) 结果可能不稳定(这个代码能保证B.CB.D总是被定义吗?)。

B.CB.D(还有B)放进命名空间的方法可以接受吗?有没有更好的方法?也许找到一个可读性强的折中方案,比如from A.B import C as B_C, D as B_D,会更好?

虽然我现在用的是Python 2.6(没有importlib模块……),但我也对任何现代的解决方案感到好奇。

3 个回答

1

最简单的方法就是按照Jayanth说的做。如果A的名字很长,你可以用' as '这个关键词来改个名字。

import A as X
2

对于from A import B.C这个用法,我建议可以这样做:

from A.B import C as B_C
1

importlib 可以在这里派上用场

import importlib
from A import B
importlib.import_module('A.B.C')
importlib.import_module('A.B.D')
# Now you can use B.C & B.D

在 Python 2.6 中,你应该能够这样做

from A import B
import A.B.C
import A.B.D
del A

撰写回答