簡體   English   中英

如何使用 Pydantic 驗證復雜的嵌套數據結構?

[英]How to validate a complex nested data structure with Pydantic?

我有如下復雜且嵌套的數據結構:

{   0: {   0: {'S': 'str1', 'T': 4, 'V': 0x3ff},
           1: {'S': 'str2', 'T': 5, 'V': 0x2ff}},
    1: {   0: {'S': 'str3', 'T': 8, 'V': 0x1ff},
           1: {'S': 'str4', 'T': 7, 'V': 0x0ff}},
......
}

它基本上是一個二維字典。 最里面的字典遵循 {Str: str, str:int, str:int},而它的外部字典總是以 integer 作為索引的鍵。

Pydantic 有沒有辦法驗證數據類型和數據結構? 我的意思是如果有人用一個字符串作為外部字典的鍵更改數據,代碼應該提示錯誤。 或者,如果有人通過將“V”值賦給字符串來調整內部字典,則檢查員需要對此進行投訴。

我是 Pydantic 的新手,發現它總是需要一個 str 類型的字段來存儲任何數據……有什么想法嗎?

您可以將Dict用作​​自定義根類型,並將int用作鍵類型(使用嵌套 dict)。 像這樣:

from pydantic import BaseModel, StrictInt
from typing import Union, Literal, Dict

sample = {0: {0: {'S': 'str1', 'T': 4, 'V': 0x3ff},
              1: {'S': 'str2', 'T': 5, 'V': 0x2ff}},
          1: {0: {'S': 'str3', 'T': 8, 'V': 0x1ff},
              1: {'S': 'str4', 'T': 7, 'V': 0x0ff}}
          }


# innermost model
class Data(BaseModel):
    S: str
    T: int
    V: int


class Model(BaseModel):
    __root__: Dict[int, Dict[int, Data]]


print(Model.parse_obj(sample))

只是為了分享一個替代選項 - convtools 模型文檔| github )。

它在僅驗證模式下工作,除非您明確告訴它強制轉換類型。 而且默認情況下它不使用不安全的類型轉換(例如,將1.5轉換為1是不好的)。

from typing import Dict, Literal, Union
from convtools.contrib.models import DictModel, build

sample = {
    0: {
        0: {"S": "str1", "T": 4, "V": 0x3FF},
        1: {"S": "str2", "T": 5, "V": 0x2FF},
    },
    1: {
        0: {"S": "str3", "T": 8, "V": 0x1FF},
        1: {"S": "str4", "T": 7, "V": 0x0FF},
    },
}


# innermost model
class Data(DictModel):
    S: str
    T: int
    V: int


obj, errors = build(Dict[int, Dict[int, Data]], sample)
"""
>>> In [58]: obj
>>> Out[58]:
>>> {0: {0: Data(S='str1', T=4, V=1023), 1: Data(S='str2', T=5, V=767)},
>>>  1: {0: Data(S='str3', T=8, V=511), 1: Data(S='str4', T=7, V=255)}}
"""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM