# HG changeset patch # User Pierre-Yves David # Date 1285945381 -7200 # Node ID c9eed503722381a4ebc0874938772666fd521c6b # Parent df4fd2a1b0e76964ff74e93b6152d994349831be [repo threads] Add several safety when looking for a callable name. We lookup __name__ attribute, then func_name attribute. object repr is a last fallback diff -r df4fd2a1b0e7 -r c9eed5037223 server/utils.py --- a/server/utils.py Fri Oct 01 11:09:25 2010 +0200 +++ b/server/utils.py Fri Oct 01 17:03:01 2010 +0200 @@ -117,6 +117,14 @@ sconfig.input_config(inputlevel=inputlevel) return sconfig +_MARKER=object() +def func_name(func): + name = getattr(func, '__name__', _MARKER) + if name is _MARKER: + name = getattr(func, 'func_name', _MARKER) + if name is _MARKER: + name = repr(func) + return name class LoopTask(object): """threaded task restarting itself once executed""" @@ -124,7 +132,7 @@ if interval <= 0: raise ValueError('Loop task interval must be > 0 ' '(current value: %f for %s)' % \ - (interval, func.__name__)) + (interval, func_name(func))) self.interval = interval def auto_restart_func(self=self, func=func, args=args): try: @@ -132,7 +140,7 @@ finally: self.start() self.func = auto_restart_func - self.name = func.__name__ + self.name = func_name(func) def __str__(self): return '%s (%s seconds)' % (self.name, self.interval) @@ -162,7 +170,7 @@ self.running_threads.remove(self) Thread.__init__(self, target=auto_remove_func) self.running_threads = running_threads - self._name = target.__name__ + self._name = func_name(target) def start(self): self.running_threads.append(self)