2013-04-29 1 views
2

https://github.com/jdavisp3/twisted-intro/blob/master/twisted-client-3/get-poetry.py가져온 물건의 객체 범위는 어떻게 작동합니까?

반응기는

def get_poetry(host, port, callback): 
    ... 
    from twisted.internet import reactor 

뿐만 아니라 메인 함수에 반입 여기서 ---- fortan의 대답 후

을 --edited.

그리고 그래서 모두 원자로가 같은 반응을 가리 할

def poetry_main(): 
    ... 
    def got_poem(poem): 
     poems.append(poem) 
     if len(poems) == len(addresses): 
      reactor.stop() 

정지? 동일한 항목을 여러 번 가져 오는 방법은 무엇입니까? 또한

왜 그냥 다음 단지 그것을 사용하기 전에 대신 함수 내에서 프로그램의 상단에

from twisted.internet import reactor 

을 정의?

답변

0

자세히 살펴 보려면 poetry_main에 또 다른 from twisted.internet import reactor이 있습니다. 수입의 범위는 변수와 함수처럼 어휘 적입니다.

이유는 모듈의 전역 네임 스페이스를 오염시키지 않는 것입니다.

파이썬은 가져온 모듈의 내부 사전을 유지하므로 모듈이 몇 번이나 사용되던간에 import ed; 한 번만로드되고 내부 상태는 모든 참조간에 공유됩니다.

순환 모듈 종속성을 허용하는 것이 중요합니다. 그렇지 않으면 무한 재귀에서 끝납니다.

+0

수정 사항을 확인해주세요. –

+0

확실히 더 많은 정보가 추가됨 – fortran

+0

고마워. .. 나는 마지막 파라를 이해하지 못했다. –

2

twisted.internet.reactor 때로는 모듈 수준에서 수입되지 않는 이유는 특정 원자로 구현이 이미 명시 적으로 선택되어 있지 않은 경우가 수입되어 처음 시간, 기본 선택이 될 것입니다. 구현이 선택되면 변경할 수 없습니다.

모듈이 최상위 수준에서 twisted.internet.reactor을 가져 오는 경우 가져온 즉시 원자로를 가져옵니다. 따라서 최상위에서 twisted.internet.reactor을 가져 오는 모듈을 가져 오기 전에 다른 원자로 구현을 선택하는 것이 다소 어려워집니다.

따라서 하나의 규칙은 해당 함수를 사용해야하는 함수 내에서만 twisted.internet.reactor을 가져 오는 것입니다. 즉, 함수가 호출 될 때까지 가져 오기가 수행되지 않습니다. 일반적으로 구현이 이미 선택되었을 정도로 늦습니다.

또 다른 규칙 (자신을 비롯한 일부 사람들이 선호)은 원자로를 인수로 허용하는 API를 정의하는 것입니다. 당신이 원자로를 전혀 가져 오지 않는 이런 식으로, 그것은 당신의 기능이 필요로하는 다른 어떤 입력과 함께 당신에게 전달됩니다.

이 접근법의 큰 장점 중 하나는 코드를 단위 테스트가보다 쉽게 ​​수행 할 수 있다는 것입니다.

관련 문제