簡體   English   中英

pydantic 如何使用 pydantic 將十六進制字符串設置為 int?

[英]pydantic How to set hex string to int using pydantic?

有時,任何數據都會返回一個像“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))

Pydantic 確實通過數據類驗證器提供對其設置器的低級訪問,因此這是使用的方法。 創建一個時,您需要注意處理傳入的數據並根據您的要求對其進行處理。 在您的示例中,它應該允許None 、標准int以及任何表示十六進制字符串的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)

暫無
暫無

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

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