You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扩展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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:12