2017-12-09 4 views
0

ich mehrere Callback-Funktionen über mehrere Eigenschaften mit Code zu binden bin versucht, das wie etwas aussieht:Wrap Callback-Funktion zusätzliches Argument aufzunehmen, wenn Anrufer Signatur genau Rückruf prüft

for key in keys: 
    def callback(self, value): 
     #Do stuff... 
     return None 

    doSomething(callback) 

Dies funktioniert, weil der Angerufene Code (das Anrufe callback) erwarten genau zwei Parameter und die callback, None zurückzukehren. Die Frage ist nun möchte ich den Rückruf wickeln, so dass ich auch die key in so etwas wie passieren kann:

for key in keys: 
    def wrappedCallback(self, value): 
     #How do I get key in here??? 
     realCallback(self, key, value) 
     return None 

    doSomething(wrapperCallback) 

Aber ich habe keine Ahnung, wie Schlüssel zu bekommen innerhalb von wrapperCallback. Ich kann nicht einen zusätzlichen Standardparameter wie hinzufügen:

... 
#This throws with "expected a function taking 2 arguments, not 3" 
def wrappedCallback(self, value, key=key): 
    realCallback(self, key, value) 
    ... 

weil dies einen Fehler von dem Anrufer (es ist C-Code, der einen sehr strengen Rückruf erwartet) werfen. Ich habe auch functools.partial versucht, aber dann bekomme ich expected a function, not a functools.partial

Wie kann ich die übergebene Callback-Funktion wickeln Sie den externen Parameter key (von der for-Schleife) aufzunehmen, während die genaue Signatur beschrieben zu halten?

Antwort

0

Minuten nachdem ich herausgefunden habe, dass ich eine Funktion innerhalb der for-Schleife erstellen kann, um einen neuen Stapelrahmen zu erhalten. Dies ist leider scheint nicht an allen Pythonic ...

for key in keys: 
    def dummyForStackFrame(key): #Extra function to get a new stack frame with key 
     def wrappedCallback(self, value): 
      realCallback(self, key, value) 
      return None 
     doSomething(wrappedCallback 
    dummyForStackFrame(key) 
1

Ich würde einen Rückruf Generator erstellen, die Ihre Parameter (wie key) führt und erstellt Ihre Rückrufe.

>>> def callback_generator(key): 
...  def callback(self, value): 
...   do_something_with(key, value) 
...  return callback 
... 
>>> for key in keys: 
...  doSomething(callback_generator(key)) 
... 
+0

Ich mag das besser, weil es zumindest außerhalb der for-Schleife ist – Coburn

Verwandte Themen