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()