如何在Python中迭代frozen dataclass?(禁止使用dict)
问题分析与解决
原代码报错是因为ParserClass初始化时将SomeDataclass类本身赋值给了my_data,后续迭代的是类对象而非实例集合,因此触发TypeError。结合你使用不可变frozen dataclass且避免使用dict、可迭代my_data的需求,解决方案如下:
修正后的代码
from dataclasses import dataclass from typing import Type, Tuple # 用不可变的元组替代原dict,满足禁止使用dict的要求 data = (("demo1", "description for demo 1"), ("demo2", "description for demo 2")) @dataclass(frozen=True) class SomeDataclass: name: str description: str class ParserClass: def __init__(self, some_data_class: Type[SomeDataclass]) -> None: # 初始化my_data为不可变空元组 self.my_data: Tuple[SomeDataclass, ...] = () def parsing_method(self, demo_data) -> None: # 生成包含所有frozen实例的元组,替换原my_data self.my_data = tuple( some_data_class(name=name, description=desc) for name, desc in demo_data ) test = ParserClass(SomeDataclass) test.parsing_method(data) for item in test.my_data: print(item.name, item.description)
核心改动说明
- 用元组存储实例集合:元组是不可变容器,符合你拒绝可变对象的要求,同时天然支持迭代。
- 替换原dict输入:将输入的
dict改为元组嵌套元组,彻底避免使用dict结构。 - 正确保存实例集合:
parsing_method中通过生成器表达式创建所有SomeDataclass实例的元组,赋值给my_data,确保后续迭代的是实例集合而非类对象。 - 类型标注优化:添加类型标注明确变量类型,提升代码可读性。
内容的提问来源于stack exchange,提问作者Chaban33
相关产品推荐
相关产品推荐

