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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:06:09