如何正确使用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
相关产品推荐
相关产品推荐

