9

I have the following python code using the twisted 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)

It uses the Twisted API. What i want to achieve is to pass to the callbacked function (results) the value of the name which is constructed in every iteration without changing the content of the functions_which_returns_a defer() function along with the deferred object of course. In every result of the functions_which_returns_a deffer the value of the name should be passed to results() to do something with this. I.e: at the first iteration when the execution reach the results function i need the function hold the result of the deffered object along with the value of name when i=0,then when i=1 the defered object will be passed with the value of name, and so on.So i need every time the result of the defer object when called with the name variable alond with the name variable. When i try to directly use the value of nameinside results() it holds always the value of the last iteration which is rationale, since function_which_returns_a defer(name) has not returned.

curious
  • 1,524
  • 6
  • 21
  • 45
  • For the general case see [callback - Python, how to pass an argument to a function pointer parameter? - Stack Overflow](https://stackoverflow.com/questions/13783211/python-how-to-pass-an-argument-to-a-function-pointer-parameter). In this specific case (twisted library) the solution below is better. – user202729 Aug 15 '21 at 06:18

1 Answers1

20

You can pass extra arguments to a Deferred callback at the Deferred.addCallback call site by simply passing those arguments to 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)

You can also pass arguments by keyword:

        df.addCallback(results, name=name)

All arguments passed like this to addCallback (or addErrback) are passed on to the callback function.

Jean-Paul Calderone
  • 47,755
  • 6
  • 94
  • 122