扩展threading.Timer以从函数返回值会导致TypeError [英] Extending threading.Timer for returning value from function gives TypeError

查看:44
本文介绍了扩展threading.Timer以从函数返回值会导致TypeError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试扩展threading.Timer,以便可以从函数获得返回值。我使用了this thread中的解决方案并应用了修改(因为Timer()已经接受了*args和**kwargs,我认为我不需要再次传递它)。代码完全是这样的:

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

我不理解这个错误,因为函数()非常简单,它接收*self.args和**self.kwargs,我看不出它可能在哪里查找字符串,因为初始化程序与超类的初始化程序几乎相同。请注意,这是在导入类时发生的,甚至代码都不会使用它。

推荐答案

您收到的错误是因为Timer不是一个类,而是函数/方法2threading.py

>>> from threading import Timer
>>> type(Timer)
<type 'function'>

具体类为_Timer。此外,您的代码确实存在一些问题;您的init缺少参数,并且未设置targetargskwargsinterval

您可能会遇到这种情况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

演示:

def add_together(a, b):
    return a + b

c = CustomTimer(1, add_together, (2, 4))
c.start()
print c.join()

在1秒后打印6

这篇关于扩展threading.Timer以从函数返回值会导致TypeError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆