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

Python dataclass依赖注入时空列表默认值引发异常解决方法

问题描述

定义了一个基础dataclass,需要将其能力注入到逻辑更复杂的类中,未做继承注入时,该dataclass可按预期正常运行:

from dataclasses import dataclass, field
from typing import NamedTuple, List


@dataclass
class Data:
    name: str
    start_url: str
    saved_urls: List[str] = field(default_factory=list)

google = Data("Google", "https://www.google.com")
print(google)

# 运行结果:Data(name='Google', start_url='https://www.google.com', saved_urls=[])

通过让Crawl类继承Data类实现能力注入时,程序抛出类型错误,异常触发与初始化阶段强制要求传入saved_urls参数有关,报错的实现代码如下:

from dataclasses import dataclass, field
from typing import NamedTuple, List


@dataclass
class Data:
    name: str
    start_url: str
    saved_urls: List[str] = field(default_factory=list)


class Crawl(Data):
    def __init__(self, name, start_url, saved_urls):
        self.name = name
        self.start_url = start_url
        self.saved_urls = saved_urls


def main():
    google = Crawl("Google", "https://www.google.com")
    
if __name__ == "__main__":
    main()

# 抛出异常:TypeError: __init__() missing 1 required positional argument: 'saved_urls'

报错根因:子类Crawl手动重写__init__方法时,将父类中配置了默认值的saved_urls定义为必传位置参数,覆盖了dataclass自动生成的带默认参数的初始化逻辑,实例化时未传入该参数就会触发参数缺失异常。

解决方案

在子类__init__方法中直接调用父类构造方法,仅传入必填的两个参数即可,父类会自动为saved_urls应用配置好的默认值,实现代码如下:

@dataclass
class Data:
    name: str
    start_url: str
    saved_urls: List[str] = field(default_factory=list)

class Crawl(Data):
    def __init__(self, name, start_url):
        super().__init__(name, start_url)

def main():    
    google = Crawl("Google", "https://www.google.com")
    print(google)

if __name__ == "__main__":
    main()

# 运行结果:Data(name='Google', start_url='https://www.google.com', saved_urls=[])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:06:27