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



有时,任何数据都会返回一个十六进制字符串,如"bbb"。我想用"bbb"来int value。所以我写了代码case。但这是一个错误。

如何使用BaseModel将十六进制字符串转换为整型值?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))

Pydantic确实通过数据类验证器提供了对其setter的低级访问,所以这是要使用的方法。在创建时,您需要注意处理传入的数据,并根据您的需求对其进行处理。在您的示例中,它应该允许None,标准ints和任何表示十六进制字符串的str。因此,以下实现可以满足上述约束:

class DataTemp(BaseModel):
aaa : int
bbb : Optional[int]
@validator('bbb', pre=True, always=True)
def set_bbb(cls, v, values, **kwargs):
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 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for DataTemp
bbb
invalid literal for int() with base 16: 'asdf' (type=value_error)