Python:如何导入命名空间的一部分

Python:如何导入命名空间的一部分,python,import,namespaces,Python,Import,Namespaces,我有一个这样的结构: import a.b.c a.b.c.foo() 这也适用于: from a.b import c c.foo() 但这不起作用: from a import b.c b.c.foo() 也没有: from a import b b.c.foo() 如何进行导入以使b.c.foo()工作?在“b”包中,您需要添加“import c”,以便始终可以作为b的一部分访问它 from a import b from a.b import c b.c = c 导入语句的顺序

我有一个这样的结构:

import a.b.c
a.b.c.foo()
这也适用于:

from a.b import c
c.foo()
但这不起作用:

from a import b.c
b.c.foo()
也没有:

from a import b
b.c.foo()

如何进行导入以使
b.c.foo()
工作?

在“
b
”包中,您需要添加“
import c
”,以便始终可以作为
b
的一部分访问它

from a import b
from a.b import c
b.c = c
导入语句的顺序无关紧要。

只需重命名它:


from a.b import c as BAR

BAR.foo()

然后b必须猜出你想在上面使用的所有子模块?代码是用c编写的,难道没有更好的方法吗?是否有特别的原因需要用b.c.foo()语法而不是c.foo()来编写代码?是的,前缀很长,有很多嵌套模块,但是导入“c”会导致名称空间冲突。好的,除此之外,假设编写c.foo()在语义上更正确因此,我们不能回避这个问题。命名空间冲突更容易通过a
从a.b导入c作为b_c
和类似的重命名来解决。不确定“monkeypatching the code”是什么意思——它是monkeypatching module(package)b来弥补它显然没有导入自己的c子模块的事实。顺便说一句,当然,也可以使用
as
来更改中间名称,不管您是否将其作为
b.c
进行monkeypatch。

from a.b import c as BAR

BAR.foo()