【问题标题】:marshmallow_dataclass - subclassing builtin typesmarshmallow_dataclass - 子类化内置类型
【发布时间】:2021-07-08 18:38:26
【问题描述】:

我正在使用 marshmallow 数据类来键入检查可用作字典的文件。 在文件中有一些特殊的数字三元组,它们指定(典型值、最小值、最大值)值。 我想验证这些值并将其存储在特殊的类中,子类化 python 的元组。 但是,我总是收到一个 ValidationError:

这是一个 MWE

from typing import Any, Tuple, List
from marshmallow_dataclass import dataclass

data = {'key1': (1, 2, 3),
        'key2': (2, 3, 4)}

@dataclass
class Triplet(Tuple[int, int, int]):
    pass

    def someCalculation(self):
        pass

@dataclass
class Triplet2(List):
    pass

    def someCalculation(self):
        pass



@dataclass
class MySchema:
    key1: Tuple[int, int, int]
    key2: Triplet

schema = MySchema.Schema().load(data)
print(schema)

我已经尝试过继承 List 和 Tuple,但我的尝试都没有按预期工作。 有没有办法使用我的 Triplet 类?

【问题讨论】:

    标签: python python-typing python-dataclasses


    【解决方案1】:

    幸运的是,我发现 marshmallow 的 pre_load 装饰器能够满足我的需求。

    在这个函数中,我返回一个带有我想要的键的字典,所以 Triplet 类被正确实例化了

    from typing import Any, Tuple, List
    from marshmallow_dataclass import dataclass
    from marshmallow import pre_load
    
    data = {'key1': (1, 2, 3),
            'key2': (2, 3, 4)}
    
    @dataclass
    class Triplet:
        typ: float
        min: float
        max: float
    
        @pre_load
        def preprocess(self, data, **kwargs):
            return {'typ': data[0], 'min': data[1], 'max': data[2]}
    
        def someCalculation(self):
            pass
        
    @dataclass
    class MySchema:
        key1: Tuple[int, int, int]
        key2: Triplet
    
    schema = MySchema.Schema().load(data)
    print(schema)
    

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多