我有一个带有 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]”,
…
]
}
但我不希望每个内部数组都用引号打印。
如果序列中正好有 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]]}
如果实现自定义方法可以使您的代码更具可读性和易于使用,请不要害怕。