扩展threading.Timer从函数返回值会产生TypeError

时间:2015-02-20 18:41:35

标签: python multithreading python-2.x

我试图扩展threading.Timer,所以我可以从函数中获取返回值。我使用了来自this thread的解决方案并应用了修改(因为Timer()已经使用* args和** kwargs我认为我不需要再次通过__init__)。代码完全如下:

from threading import Timer

class CustomTimer(Timer):
    def __init__(self):
        super(CustomTimer, self).__init__()
        self._return = None

    def run(self):
        super(CustomTimer, self).run()
        self._return = self._Thread__target(*self._Thread__args, **self._Thread__kwargs)

    def join(self):
        super(CustomTimer, self).join()
        return self._return

然后运行主模块时出现以下错误:

Traceback (most recent call last):
  File "main.py", line 43, in <module>
    from storage import *
  File "/home/mei/tmwAthena/manamarket/storage.py", line 13, in <module>
    from utils import ItemDB
  File "/home/mei/tmwAthena/manamarket/utils.py", line 142, in <module>
    class CustomTimer(Timer):
TypeError: Error when calling the metaclass bases
    function() argument 1 must be code, not str

我不明白这个错误,因为function()很简单,它收到* self.args和** self.kwargs,我看不到它在哪里寻找字符串,因为初始化器几乎是来自超类的相同。请注意,这是在导入类时发生的,它甚至不会被代码使用。

1 个答案:

答案 0 :(得分:5)

您获得的错误是因为Timer不是一个类,它是Python中的函数/方法 2 {{1} }:

threading.py

具体类是>>> from threading import Timer >>> type(Timer) <type 'function'> 。此外,您的代码确实存在一些问题;您的init缺少参数,_Timertargetargskwargs未设置。

您可能对此interval

感到满意
CustomTimer

演示:

from threading import _Timer

class CustomTimer(_Timer):
    def __init__(self, interval, function, args=[], kwargs={}):
        self._original_function = function
        super(CustomTimer, self).__init__(
            interval, self._do_execute, args, kwargs)

    def _do_execute(self, *a, **kw):
        self.result = self._original_function(*a, **kw)

    def join(self):
        super(CustomTimer, self).join()
        return self.result

在1秒后打印def add_together(a, b): return a + b c = CustomTimer(1, add_together, (2, 4)) c.start() print c.join()