本文介绍了扩展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缺少参数,并且未设置target
、args
、kwargs
和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
演示:
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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!