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

如何正确使用Python dataclass的kw_only参数?Python3.9报错排查

问题解决:dataclass 'kw_only' 参数报错的原因及替代方案

错误原因

kw_only是Python 3.10才新增的标准库dataclasses.dataclass装饰器参数,你使用的Python 3.9不支持该参数,因此会抛出TypeError: dataclass() got an unexpected keyword argument 'kw_only'错误。这个问题和attrs库无关——安装/升级attrs不会影响标准库dataclasses的功能。

替代方案(Python 3.9兼容)

要实现「基类变量有默认值,派生类变量无默认值且必须传参」的需求,有两种可行方式:

方案1:重写派生类__init__方法(标准库dataclass兼容)

通过手动控制初始化逻辑,避免位置参数顺序冲突,同时强制派生类字段必须传值:

from dataclasses import dataclass, field

@dataclass
class Base:
    c: int = field(default=8, compare=False)
    def printBVars(self):
        print("Base:", self.c)

@dataclass
class Derive(Base):
    cc: int
    
    def __init__(self, cc: int, **kwargs):
        super().__init__(**kwargs)
        self.cc = cc
    
    def printDVars(self):
        super().printBVars()
        print("Derive:", self.cc)

# 使用示例
a = Derive(cc=10)
a.printDVars()
# 输出:
# Base: 8
# Derive: 10

b = Derive(cc=20, c=5)
b.printDVars()
# 输出:
# Base: 5
# Derive: 20

该方案通过重写__init__,强制cc作为必填参数,同时用**kwargs接收基类的可选参数,既满足需求又兼容Python 3.9。

方案2:改用attrs库

attrs库的kw_only参数在Python 3.9及更早版本中就已支持,如果你愿意切换到attrs替代标准库dataclasses,可以直接使用类似原代码的写法:

import attr

@attr.s(kw_only=True)
class Base:
    c: int = attr.ib(default=8, eq=False)
    def printBVars(self):
        print("Base:", self.c)

@attr.s(kw_only=True)
class Derive(Base):
    cc: int = attr.ib()
    def printDVars(self):
        super().printBVars()
        print("Derive:", self.cc)

# 使用示例
a = Derive(cc=10)
a.printDVars()

其他选项

如果环境允许,直接升级Python到3.10或更高版本,即可直接使用原代码中的kw_only参数。

内容的提问来源于stack exchange,提问作者Atheel Massalha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:15:31