2011-10-25 6 views
8

Ho il seguente codice Python che utilizza l'API twistata.Come passare argomenti extra alle funzioni di registrazione callback con twisted python api?

def function(self,filename):  
    def results(result): 
     //do something 
    for i in range(int(numbers)) : 
     name = something that has to do with the value of i   
     df = function_which_returns_a defer(name) 
     df.addCallback(results) 

Utilizza l'API Twisted. Quello che voglio ottenere è passare alla funzione callback (risultati) il valore del nome che è costruito in ogni iterazione senza modificare il contenuto della funzione functions_which_returns_a defer() insieme all'oggetto differito, naturalmente. In ogni risultato di functions_which_returns_a deffer il valore del nome deve essere passato a results() per fare qualcosa con questo. Cioè: alla prima iterazione quando l'esecuzione raggiunge la funzione risultati ho bisogno che la funzione tenga il risultato dell'oggetto deffered insieme al valore del nome quando i = 0, quindi quando i = 1 l'oggetto posticipato verrà passato con il valore di nome, e così via.Così ho bisogno di ogni volta il risultato dell'oggetto posticipato quando chiamato con la variabile name alond con la variabile name. Quando provo a usare direttamente il valore di nameinside results(), esso mantiene sempre il valore dell'ultima iterazione che è logica, dal momento che function_which_returns_a defer (nome) non ha restituito.

risposta

15

È possibile passare argomenti extra a un Deferred richiamata al sito Deferred.addCallback chiamata semplicemente passando tali argomenti a Deferred.addCallback:

def function(self,filename):  
    def results(result, name): 
     # do something 
    for i in range(int(numbers)) : 
     name = something that has to do with the value of i   
     df = function_which_returns_a defer(name) 
     df.addCallback(results, name) 

È inoltre possibile passare gli argomenti per parola chiave:

 df.addCallback(results, name=name) 

Tutti gli argomenti passato così a addCallback (o addErrback) vengono passati alla funzione di callback.