我试图扩展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,我看不到它在哪里寻找字符串,因为初始化器几乎是来自超类的相同。请注意,这是在导入类时发生的,它甚至不会被代码使用。
答案 0 :(得分:5)
您获得的错误是因为Timer
不是一个类,它是Python中的函数/方法 2 {{1} }:
threading.py
具体类是>>> from threading import Timer
>>> type(Timer)
<type 'function'>
。此外,您的代码确实存在一些问题;您的init缺少参数,_Timer
,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
在1秒后打印def add_together(a, b):
return a + b
c = CustomTimer(1, add_together, (2, 4))
c.start()
print c.join()
。