pydantic 如何使用 pydantic 将十六进制字符串设置为 int?

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

有时,任何数据都会返回十六进制字符串,例如“bbb”。我想通过“bbb”使用 int 值。 所以我写了代码case1..但这是一个错误。

如何使用 BaseModel 将十六进制字符串转换为 int 值? pydantic 也有 setter getter 功能吗? 我知道像case2这样的方法,但我想直接使用json数据,因为有些键是空的......!

案例1

from pydantic import BaseModel
from typing import Optional

data = {
    "aaa" : 4,
    "bbb" : "0x3",
}

class DataTemp(BaseModel):
    aaa : int
    bbb : Optional[int]
    
def main():
    _data = DataTemp(**data)
    print(_data)
    

if __name__ == "__main__":
    main()

案例2

_data2 = DataTemp(aaa= data["aaa"], bbb=int(data["bbb"],16))
python initialization getter-setter pydantic
1个回答
2
投票

此答案已根据其迁移指南的此部分针对 Pydantic V2(特别是 2.5.x)进行了更新,同时保持了此先前修订版的初衷。


Pydantic 确实允许通过 field validators 将额外的验证器附加到给定字段。创建数据时,您需要注意处理传入数据并根据您的要求进行处理。在您的示例中,它应该允许

None
、标准
int
以及表示十六进制字符串的任何
str
。所以下面的实现可以满足提到的约束:

from typing import Optional
from pydantic import BaseModel, ValidationInfo, field_validator

class DataTemp(BaseModel):
    aaa : int
    # to allow the assignment of str along with int, even though the
    # value will always be casted back to an int via the field validator
    bbb : Optional[int | str]

    @field_validator('bbb')
    @classmethod
    def validate_bbb(cls, v: int | str, info: ValidationInfo):
        return int(v, 16) if isinstance(v, str) else v

用途:

>>> DataTemp(aaa=4, bbb=33)
DataTemp(aaa=4, bbb=33)
>>> DataTemp(aaa=4, bbb=None)
DataTemp(aaa=4, bbb=None)
>>> DataTemp(aaa=4, bbb='0x333')
DataTemp(aaa=4, bbb=819)
>>> DataTemp(aaa=4, bbb='32')
DataTemp(aaa=4, bbb=50)
>>> DataTemp(aaa=4, bbb='asdf')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pydantic/main.py", line 164, in __init__
    __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__)
pydantic_core._pydantic_core.ValidationError: 1 validation error for DataTemp
bbb
  Value error, invalid literal for int() with base 16: 'asdf' [type=value_error, input_value='asdf', input_type=str]
    For further information visit https://errors.pydantic.dev/2.5/v/value_error
© www.soinside.com 2019 - 2024. All rights reserved.