2010-02-23 8 views
2
d = Deferred() 
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed 

왜인가요? 나는 코드를 살펴보고 메시지/Trac을 커밋하고 이것이 왜 그런지에 대한 이유를 알지 못한다. 이를 우회하는 가장 확실한 방법은 튜플에 Deferred을 넣는 것입니다.하지만 왜 여기에이 제한이 있습니까?지연이 파이썬 트위스트 된 콜백에 전달되지 않는 이유는 무엇입니까?

답변

5

이와 관련된 두 가지 이유가 있습니다.

처음에는 실수가있는 곳 근처에서 일찍 실수 일 가능성이있는 부분을 잡는 데 도움이됩니다. 지연은 모든 콜백에 전달 된 결과와 함께 콜백됩니다. 결과 자체를 Deferred로 만들면 콜백이 호출 될 때 수행 할 수있는 콜백이 많지 않습니다. 이것은 다음 이유로 이어집니다.

두 번째로, 지연된 값을 전달할 수있는 가장 일반적인 사용 사례를 처리하는 체인을 지원합니다. 2 개의 Deferreds, a와 b가 주어진다면, a는 b가 결과를 가질 때까지 a가 자신의 콜백 체인을 처리하는 것을 일시 중지하고 b의 결과로 콜백 체인을 재개합니다. 이것은 Deferred의 콜백이 Deferred를 반환 할 때 발생합니다. Deferred.chainDeferred으로 명시 적으로 지정할 수도 있습니다.

관련 문제