2012-12-15 2 views
2

가능한 중복 :
Circular (or cyclic) imports in Python사용하여 다시로드() 깰 수입 루프

a.py

import b 

class Abstract(object): 
    pass 

class Concrete(Abstract): 
    def get_newthing(self): 
     return b.NewThing() 

(참고 : 제가 할 것은 어려울 것이다 a.py의 주요 리팩토링)

"수입 B, A"작업을 실행, 작성하지만, 파이썬은 a.py에서 "가져 오기 B"라인에 도달으로 실행 "가져가"

AttributeError: 'module' object has no attribute 'Abstract' 

을 제공으로 b.py

import a 
#reload(a) 

class NewThing(a.Abstract): 
    pass 

가져 오는 동안 b는 아직 생성되지 않은 "a.Abstract"에 액세스하려고 시도합니다.

내가 reload 문을 포함하고 있다면, 파이썬이 a.py 모듈로 점프하고 bazz를 계속하기 전에 Abstract 클래스를 생성하기 때문에 "import a"를 할 수 있습니다. 그래서 그것은 작동하도록 보인다. (아마 재로드를하기 전에 hasattr 검사를 추가해야한다.)

이 가져 오기 루프 문제를 해결할 방법을 찾고 있었으며이 줄에 대한 제안 사항이 없습니다. 이런 식으로 reload()를 사용하는 데 어떤 함정이 있습니까?

+0

[이 질문에 대한 순환 수입] (http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python)을 확인하십시오. –

답변

0

reload을 사용하지 마십시오. 대화식 프롬프트에서만 사용됩니다. 이 순환계를 다음과 같이 수정할 수 있습니다.

class Abstract(object): 
    pass 

class Concrete(Abstract): 
    def get_newthing(self): 
     import b 
     return b.NewThing() 

순환 삽입을 필요로하지 않으므로 코드를 리팩터링하는 것이 좋습니다.

+0

'import b' 문은'Abstract' 정의 아래에있는 한 모듈 수준에있을 수 있습니다. – Blckknght

+0

@Blckknght : 답변이있는 경우 대답으로 작성해야합니다. –

+0

이 방법으로 재 탑재를 사용하지 말아야하는 이유에 대한 자세한 정보를 제공 할 수 있습니까? – user1905527

0

a.py 모듈의 디자인이 매우 나쁩니다. 일반적으로 피할 수있는 순환 가져 오기가 있어야합니다. 가장 좋은 해결책은 Concrete 클래스 (그리고 필요한 import b 라인)를 별도의 모듈로 나눠서 ab을 반올림하지 않고 반입하는 것입니다.

그러나 상황에 맞게 너무 많은 리팩터링을 사용하는 경우 import b 행을 a.py 상단에서 Abstract 아래로 이동해보십시오. NewThing은 항상 Abstract의 정의를 볼 수 있으므로 오류가 해결됩니다.

class Abstract(object): 
    pass 

import b 

class Concrete(Abstract): 
    def get_newthing(self): 
     return b.NewThing() 

이 최소한의 변화이지만,이 상황을 위해 일해야합니다입니다

는 않습니다. 그래도 ConcreteNewThing 클래스에 대한 정의 시간 액세스가 필요하다면이 방법으로 수정할 수 없습니다.

+0

a.py가 차례로 가져 오는 다른 모듈이 있습니다. b. 그래서 저는 그것들 모두를 Abstract 아래로 이동시켜야 할 것입니다. 유지하기가 어려울 것 같습니다. – user1905527

+0

초록을 별도의 파일로 옮기는 것이 좋습니다. 그러나, 나는 실제로 a.py의 소유자가 아니며, 꽤 중요한 일이라고 생각합니다. 이것이 내가 a.py를 수정하지 않는 솔루션을 선호하는 이유입니다. reload()가 나쁜 생각 인 이유는 무엇입니까? – user1905527

+0

BTW 또한 NewThing을 a.py로 옮길 것을 제안했지만 다른 팀에서는 NewThing을 별도의 모듈에 보관하려고합니다. – user1905527