2009-08-04 6 views
3

파이썬 : 네임 스페이스의 일부를 가져 오는 방법

이 작품과 같은 구조를 가지고 :

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()이 작동하도록 가져 오기를 수행하려면 어떻게해야합니까?

+0

특별한 이유가 당신이 당신의 코드에 대한 b.c.foo() 구문 대신 c.foo()를해야하는 이유? – Amber

+0

예, 접두사는 많은 중첩 모듈에서 실제로 길지만 가져 오기 'c'는 네임 스페이스 충돌입니다. –

+0

좋습니다. 추가하여 문제를 치유 할 수 없도록 c.foo()를 작성하는 것이 의미 론적으로 정확하다고 가정합니다. –

답변

9

그냥 이름을 변경 :


from a.b import c as BAR 

BAR.foo() 
+0

최근 코멘트보기 하지만 실제로 솔루션이 작동합니다. –

2

'b'패키지에는 항상 b의 일부로 액세스 할 수 있도록 'import c'을 추가해야합니다.

+0

그러면 b는 여러분이 사용하고자하는 모든 서브 모듈을 추측해야합니까? 코드가 C에 있습니다. 더 좋은 방법이 있으면 안됩니까? –

2
from a import b 
from a.b import c 
b.c = c 
+1

코드를 monkeypatching 아닌가요? –

+0

"코드를 monkeypatching"한다는 것이 의미하는 것은 확실하지 않습니다 - 그것은 자신의 c 하위 모듈을 가져 오지 않는다는 사실을 교정하기 위해 monkeypatching module (패키지) b입니다. –

+0

BTW에서 중간 이름을'as'로 변경할 수도 있습니다. 물론'b.c'로 다시 monkeypatch하든 그렇지 않든간에. –

0
import a.b.c 
from a import b 
b.c.foo() 

중요하지 않습니다 가져 오기 문장의 순서.

관련 문제