Florian Lindner wrote:
def call(self, func, *args, **kw): def func_wrapper(): try: result = func(*args, **kw) except: if "self" in getargspec(func.on_failure).args: func.on_failure(args[0], sys.exc_info()) else: func.on_failure(sys.exc_info()) else: if "self" in getargspec(func.on_success).args: return func.on_success(args[0], result) else: return func.on_success(result) finally: if "self" in getargspec(func.on_closing).args: func.on_closing(args[0]) else: func.on_closing() name = '%s-%s' % (func.__name__, func.counter.next()) thread = self.threadfactory(None, func_wrapper, name) thread.start() return thread
In call() überprüfe ich die Signaturen der Callback-Funktionen und gebe ggfs. noch das entsprechende self, welches ich aus args[0] bekomme mit. getargspec stammt aus dem Modul inspect.
Siehst Du da noch irgendwelche Probleme
Keine Probleme, die in der Praxis auftreten. Einen Trick sauber zwischen Methoden und Funktionen zu unterscheiden gibt's wohl nicht.
oder Verbesserungen?
Vielleicht könntest du den argspec-Voodoo in die __call__()-Methode verlagern.