如何在实例化dataclass时将tick_type参数转换为映射对应值?
解决Dataclass实例化时自动转换tick_type的问题
方法1:利用__post_init__钩子(兼容所有Python 3.7+版本)
通过dataclass自带的__post_init__方法,在实例初始化完成后自动将int类型的tick_type转换为映射中的字符串值,同时修改字段类型注解为str(匹配最终存储的类型):
from dataclasses import dataclass from decimal import Decimal @dataclass class AllLastTick: tick_type_mapping = { 0: "bid_size", 1: "bid_price", 2: "ask_price", 3: "ask_size", 4: "last_trade_price", 5: "last_trade_size" } time: int tick_type: str price: float size: Decimal def __post_init__(self): # 若传入的是int类型的tick_type,自动转换为对应字符串 if isinstance(self.tick_type, int): self.tick_type = self.tick_type_mapping[self.tick_type]
测试代码:
tick_data = (1699358716, 2, 178.49, Decimal('200')) tick = AllLastTick(*tick_data) print(tick) # 输出:AllLastTick(time=1699358716, tick_type='ask_price', price=178.49, size=Decimal('200'))
方法2:使用field的converter参数(Python 3.10+)
如果你的Python版本在3.10及以上,可以直接用dataclasses.field的converter参数实现转换,代码更简洁:
from dataclasses import dataclass, field from decimal import Decimal @dataclass class AllLastTick: tick_type_mapping = { 0: "bid_size", 1: "bid_price", 2: "ask_price", 3: "ask_size", 4: "last_trade_price", 5: "last_trade_size" } time: int tick_type: str = field(converter=lambda x: AllLastTick.tick_type_mapping[x]) price: float size: Decimal
关于你之前尝试的问题说明
你之前使用default_factory无法生效,是因为default_factory的作用是生成字段的默认值,它不会接收传入的字段参数,因此无法基于传入的tick_type值做映射转换。而上述两种方法分别通过初始化后钩子或字段值转换器,实现了基于输入值的类型转换。
内容的提问来源于stack exchange,提问作者Jason Strimpel
相关产品推荐
相关产品推荐

