在Python中如何使用"from A import B.C"?
在Python中,可以明确地导入带点的子模块:
import os.path
这样就可以使用os.path
了。
现在,有没有简单的方法可以对更深层次的子模块做同样的事情呢?下面的代码(这段代码是不能用的)展示了我想要的效果:
from A import B.C
from A import B.D
(from A import B
并不会导入B.C
和B.D
,而我需要使用的是模块A.B
)。我想这样做是因为:
- 我不想让主命名空间里充满
C
和D
(from A.B import C, D
),因为它们的名字不太具体。 - 我希望把这些子子模块保留在
B
的命名空间里(原因是一样的)。
一种解决方案是这样做:
from A import B
from A.B import C, D
del C, D
这样就会加载并定义B.C
和B.D
。不过,这种做法有几个问题:(1) 相当不寻常,(2) 有点晦涩(定义B.C
和B.D
的副作用),(3) 结果可能不稳定(这个代码能保证B.C
和B.D
总是被定义吗?)。
把B.C
和B.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