Florian Lindner wrote:
Allerdings hören mein Problemchen mit dem Decorator da nicht auf. ;-) Als ich ihn in meinen eigentlichen Code eingebaut habe:
@async(on_sucess = self._cb_run_success) def run(self): pass
das Problem ist nun, dass self für den Decorator gar nicht verfügbar ist.
Mir fallen da erstmal zwei "Lösungen" ein (in Anführungszeichen, da beide unerprobt)
1) den Callback _cb_run_success zur classmethod machen, damit braucht er kein self mehr. Allerdings greife ich im in der Methode schon auf self zu, müsste meinen Code also irgendwie umbauen. Damit könnte ich die on_success Methode auch gleich komplett außerhalb der Klase stellen.
2) In __init__ der Klasse den Dekorator partial instanziieren (<- richtiger Begriff?)
def __init__(self): self.my_async = functools.partial(async(on_success = self.o_s))
Leider - wie ich eben gerade merke - ist damit das Problem nur verschoben. @self.my_async funktioniert leider ebensowenig.
Ich habe dazu eine Diskussion gefunden http://stackoverflow.com/questions/3631768/is-it-bad-practice-to-use-self- in- decorators
Man kann wohl self im Code des Decorators bekommen, indem man Element [0] der positional Arguments ausliest *args. Das würde die allgemeine Verwendbarkeit des Dekorators wohl leider ziemlich einschränken.
Grüße und vielen Dank für alle weiteren Tipps!
Wenn ich dich richtig verstehe, läuft das auf etwas in der Art hinaus: class A(object): def __init__(self, name, offset): self.name = name self.offset = offset self.run = partial(async(self.run, on_success=self.on_success), self) @staticmethod def run(self, x): return self.offset + x def on_success(self, result): print self.name, "-->", result A("foo", 123).run(42) Mir wär das allerdings zu kompliziert.