扩展Python Thread类时设置daemon=True触发参数错误求助
解决Thread子类初始化参数报错问题
错误根源是Python标准库中Thread类的__init__方法里,daemon是关键字-only参数(参数列表里有个*作为分隔符),你直接把它作为位置参数传给父类构造方法,就会导致位置参数数量超出预期,触发__init__() takes from 1 to 6 positional arguments but 7 were given错误。
另外你的代码还有两个小问题:
kwargs={}作为默认参数会导致多个实例共享同一个字典,应该改成kwargs=None,再在方法内部赋值为{}- 你需要把
daemon的默认值设为True来满足需求,而不是None
下面是修正后的代码:
from threading import Thread class Thread1(Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, daemon=True): # 修复可变默认参数的问题 if kwargs is None: kwargs = {} # 用关键字参数传递daemon给父类构造方法 Thread.__init__(self, group=group, target=target, name=name, args=args, kwargs=kwargs, daemon=daemon) self._return = None def run(self): if self._target is not None: self._return = self._target(*self._args, **self._kwargs) def join(self, *args): Thread.join(self, *args) return self._return
更推荐用super()调用父类构造方法,写法更简洁规范:
from threading import Thread class Thread1(Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, daemon=True): if kwargs is None: kwargs = {} super().__init__(group=group, target=target, name=name, args=args, kwargs=kwargs, daemon=daemon) self._return = None def run(self): if self._target is not None: self._return = self._target(*self._args, **self._kwargs) def join(self, *args): super().join(*args) return self._return
测试示例:
def test_func(a, b): return a + b t = Thread1(target=test_func, args=(2,3)) t.start() result = t.join() print(result) # 输出5,且线程默认daemon=True
内容的提问来源于stack exchange,提问作者sapkodas
相关产品推荐
相关产品推荐

