使用dataclass时遇__init__()缺少必填位置参数问题
问题解决:Dataclass字段默认值与参数顺序报错
错误原因分析
- 第一个报错
TypeError: __init__() missing 2 required positional arguments:root_folder_idx和folder_idx仅设置了repr=False,未指定默认值,dataclass会将它们判定为必填参数,实例化时必须传入。 - 第二个报错
TypeError: non-default argument 'root_folder_idx' follows default argument:Python语法强制要求,带默认值的参数必须排在无默认值参数之前,调整layouts位置后,后续无默认值的字段违反了该规则。
符合需求的正确实现
要达成以下目标:
layouts初始化为Layout对象列表root_folder_idx和folder_idx初始化为空字典且不参与repr输出
需给两个字典字段添加default_factory=dict(用工厂函数避免可变类型默认值的共享引用问题),同时保留repr=False;若自定义的__repr__需要排除这两个字段,也要对应调整输出逻辑:
from dataclasses import dataclass, field from typing import List import json # 假设Layout为已定义的类 class Layout: pass @dataclass class LayoutCollection: # 给字典字段设置默认工厂函数,同时排除自动repr root_folder_idx: dict = field(default_factory=dict, repr=False) folder_idx: dict = field(default_factory=dict, repr=False) # layouts用默认工厂生成空列表 layouts: List[Layout] = field(default_factory=list) def __post_init__(self): if len(self.folder_idx) == 0: self._populate_folder_index() self._populate_root_folder_index() def __repr__(self): # 过滤掉不参与repr的字段 filtered_attrs = {k: v for k, v in self.__dict__.items() if k not in ['root_folder_idx', 'folder_idx']} return json.dumps(filtered_attrs) # 示例填充方法 def _populate_folder_index(self): self.folder_idx["demo"] = 1 def _populate_root_folder_index(self): self.root_folder_idx["root_demo"] = 0
验证效果
现在无需传参即可实例化,且输出符合预期:
lc = LayoutCollection() print(lc) # 输出: {"layouts": []} print(lc.folder_idx) # 输出: {'demo': 1}
内容的提问来源于stack exchange,提问作者Jorvis
相关产品推荐
相关产品推荐

