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

Pourquoi est-ce? J'ai regardé à travers le code et commettre des messages/Trac et ne vois pas pourquoi cela devrait être le cas. La manière la plus évidente de contourner ceci est de mettre le Deferred dans un tuple, mais pourquoi cette restriction est-elle ici en premier lieu?Pourquoi un différé ne peut-il pas être passé à un callback dans Python Twisted?

Répondre

5

Il existe deux raisons liées à cela. Tout d'abord, il aide à attraper tôt ce qui est probablement une erreur - près de l'endroit où l'erreur est commise. Un différé est rappelé avec un résultat qui est ensuite passé à tous ses callbacks. Si vous rendez le résultat lui-même différé, il n'y a pas grand chose que ces rappels peuvent faire quand ils sont appelés. Cela m'amène à la raison suivante.

Deuxièmement, le support différé est chaînage qui gère les cas d'utilisation les plus communs que l'on pourrait avoir pour passer dans un différé. Étant donné deux différés, a et b, le chaînage fait que a met en pause le traitement de sa propre chaîne de rappel jusqu'à ce que b ait un résultat, puis a reprend sa chaîne de rappel avec le résultat de b. C'est ce qui arrive lorsqu'un rappel sur un différé renvoie un différé. Il peut également être fait explicitement avec Deferred.chainDeferred.

Questions connexes