如何用 2D 列表漂亮地转储 Pydantic 模型

问题描述 投票:0回答:1

我有一个带有 2D 数组的 pydantic 模型,当我将其转储到文件时,我想漂亮地打印它。供参考:

import json
from annotated_types import Len
from typing_extensions import Annotated 

from pydantic import BaseModel, Field, ConfigDict

TwoDim = Annotated[
   Sequence[float],
   Len(min_length=2, max_length=2),
]

class Tester(BaseModel):
    test_val: Sequence[TwoDim] = Field()

我尝试实现自定义编码器并使用模型的 ConfigDict:

# in the model definition 
    model_config = ConfigDict(
        json_encoders={
            TwoDim: NoIndentEncoder().encode
        }
    )

class NoIndentEncoder(json.JSONEncoder):
    def encode(self, obj):
        if isinstance(obj, list):
            return f”[{‘, ‘.join([json.dumps(elem) for elem in obj])}]”
        return super().encode(obj)

这几乎给了我正确的输出(读取为 json 文件):

{
    “test_val”: [
        “[0.0, 1.2]”,
        …
    ]
}

但我不希望每个内部数组都用引号打印。

python json formatting pydantic pydantic-v2
1个回答
0
投票

如果序列中正好有 2 个值,我建议将其替换为具有明确命名属性的对象:

class Value(BaseModel):
    x: float
    y: float


class Tester(BaseModel):
    values: Sequence[Value]

    def dump(self) -> dict:
        """Dump object."""
        
        # Use any format here, I provided yours just as example
        return {
            "values": [
                [value.x, value.y] for value in self.values
            ]
        }
    
tester = Tester(values=[Value(x=1, y=2), Value(x=2, y=3)])
tester.dump()  # {'values': [[1.0, 2.0], [2.0, 3.0]]}

如果实现自定义方法可以使您的代码更具可读性和易于使用,请不要害怕。

© www.soinside.com 2019 - 2024. All rights reserved.