我试图扩展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
from storage import *
File "/home/mei/tmwAthena/manamarket/storage.py", line 13, in
from utils import ItemDB
File "/home/mei/tmwAthena/manamarket/utils.py", line 142, in
class CustomTimer(Timer):
TypeError: Error when calling the metaclass bases
function() argument 1 must be code, not str
我不明白这个错误,因为function()非常简单,它收到* self.args和** self.kwargs,我无法看到它在哪里寻找一个字符串,因为初始化器几乎是相同的超类.请注意,这是在导入类时发生的,它甚至没有被代码使用.
解决方法:
你得到的错误是因为Timer不是一个类,它是Python 2中的一个函数/方法threading.py:
>>> from threading import Timer
>>> type(Timer)
具体类是_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.
标签:python,multithreading,python-2-x
来源: https://codeday.me/bug/20190623/1275435.html