Почему Deferred не может быть передан обратному вызову в Python Twisted? - PullRequest
2 голосов
/ 23 февраля 2010
d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed

Почему это? Я просмотрел код и зафиксировал сообщения / Trac и не вижу причин, почему так должно быть. Самый очевидный способ обойти это - поместить Deferred в кортеж, но почему это ограничение здесь, в первую очередь?

1 Ответ

5 голосов
/ 26 февраля 2010

Для этого есть две причины.

Во-первых, это помогает уловить то, что, вероятно, является ошибкой, на ранней стадии - вблизи места, где эта ошибка совершается. Отложенный вызывается с результатом, который затем передается всем его обратным вызовам. Если вы сделаете сам результат Отложенным, тогда эти обратные вызовы мало что могут сделать, когда они вызываются. Это приводит меня к следующей причине.

Во-вторых, Deferreds поддерживают chaining , который обрабатывает наиболее распространенные варианты использования, которые могут иметь место для передачи в Deferred. При наличии двух Deferreds, a и b, создание цепочки заставляет a приостанавливать обработку собственной цепочки обратных вызовов до тех пор, пока b не даст результат, а затем возобновляет свою цепочку обратных вызовов с результатом b. Это то, что происходит, когда обратный вызов на Отложенном возвращает Отложенное. Это также можно сделать явно с помощью Deferred.chainDeferred.

...