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

发布于 2025-02-06 00:44:00 字数 634 浏览 2 评论 0原文

有时,任何数据都会返回像“ BBB”这样的十六进制字符串。我想用“ bbb”来估算。 所以我写了代码案例1 ..但这是一个错误。

如何使用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))

Sometimes, any data return a hex string like "bbb". I wanna use to int value by "bbb".
So I wrote code case1.. but it is an error.

How to convert hex string to int value using BaseModel?
Does pydantic also have a setter getter function?
I know a method like case2, but I wanna use a json data directly, because of some key is empty...!

case 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()

case2

_data2 = DataTemp(aaa= data["aaa"], bbb=int(data["bbb"],16))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

弥繁 2025-02-13 00:44:08

根据他们的迁移指南的这一部分 此先前的修订版。。


pydantic确实允许通过现场验证器。创建一个时,您需要注意处理传入的数据并根据您的要求处理。在您的示例中,它应允许,标准int s以及代表十六进制字符串的任何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,
    # and set the default value to None to permit omitted key in V2
    bbb: Optional[int | str] = None

    @field_validator('bbb')
    @classmethod
    def validate_bbb(cls, v: Optional[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 omitted, defaults to None as specified
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

This answer has been updated for Pydantic V2 (specifically 2.5.x) as per the this section of their migration guide while maintaining the original intent of this prior revision.


Pydantic does allow the attachment of additional validators to a given field by via field validators. When creating one you will need to take care to deal with the incoming data and process it based on your requirements. In your example, it should allow None, standard ints and also any str that represent a hexadecimal string. So the following implementation can satisfy the mentioned constraints:

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,
    # and set the default value to None to permit omitted key in V2
    bbb: Optional[int | str] = None

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

Usage:

>>> DataTemp(aaa=4, bbb=33)
DataTemp(aaa=4, bbb=33)
>>> DataTemp(aaa=4, bbb=None)
DataTemp(aaa=4, bbb=None)
>>> DataTemp(aaa=4)  # bbb omitted, defaults to None as specified
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文