有时,任何数据都会返回十六进制字符串,例如“bbb”。我想通过“bbb”使用 int 值。 所以我写了代码case1..但这是一个错误。
如何使用 BaseModel 将十六进制字符串转换为 int 值? pydantic 也有 setter getter 功能吗? 我知道像case2这样的方法,但我想直接使用json数据,因为有些键是空的......!
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()
_data2 = DataTemp(aaa= data["aaa"], bbb=int(data["bbb"],16))
此答案已根据其迁移指南的此部分针对 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