最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的Pydantic序列化詳解

 更新時(shí)間:2023年10月08日 09:55:52   作者:__如風(fēng)__  
這篇文章主要介紹了Python中的Pydantic序列化詳解,Pydantic 是 Python 中一個(gè)高性能的數(shù)據(jù)驗(yàn)證和序列化庫(kù),它提供了一個(gè)簡(jiǎn)單而強(qiáng)大的方式來(lái)定義結(jié)構(gòu)化的數(shù)據(jù),并在應(yīng)用程序的各個(gè)層次中使用這些數(shù)據(jù),需要的朋友可以參考下

Pydantic系列之序列化

model_dump

model_dump將對(duì)象轉(zhuǎn)化為字典對(duì)象,之后便可以調(diào)用Python標(biāo)準(zhǔn)庫(kù)序列化為json字符串,會(huì)序列化嵌套對(duì)象。

也可以使用dict(model)將對(duì)象轉(zhuǎn)化為字典,但嵌套對(duì)象不會(huì)被轉(zhuǎn)化為字典。

自定義序列化

@field_serializer

裝飾在實(shí)例方法或者靜態(tài)方法,被裝飾方法可以是以下四種。

  1. (self, value: Any, info: FieldSerializationInfo)
  2. (self, value: Any, nxt: SerializerFunctionWrapHandler, info: FieldSerializationInfo)
  3. (value: Any, info: SerializationInfo)
  4. (value: Any, nxt: SerializerFunctionWrapHandler, info: SerializationInfo)

默認(rèn)為PlainSerializer,不走pydantic的序列化邏輯,此時(shí)的方法簽名只能是1或3,

nxt參數(shù)為pydantic序列化鏈

mode='wrap’支持上述四個(gè)方法簽名,可完成前置處理,pydantic序列化邏輯,載返回之前再處理的邏輯。

from datetime import datetime, timedelta, timezone
from pydantic import BaseModel, ConfigDict, field_serializer
from pydantic_core.core_schema import FieldSerializationInfo, SerializerFunctionWrapHandler
class WithCustomEncoders(BaseModel):
    model_config = ConfigDict(ser_json_timedelta='iso8601')
    dt: datetime
    diff: timedelta
    diff2: timedelta
    @field_serializer('dt')
    def serialize_dt(self, dt: datetime, _info: FieldSerializationInfo):
        print(_info)
        return dt.timestamp()
    # 下面的裝飾器先執(zhí)行
    @field_serializer('diff')
    def ssse(self, diff: timedelta, info: FieldSerializationInfo):
        print(info)
        return diff.total_seconds()
    @field_serializer('diff2', mode='wrap')
    @staticmethod
    def diff2_ser(diff2: timedelta, nxt: SerializerFunctionWrapHandler, info: FieldSerializationInfo):
        value = nxt(diff2)
        return value + 'postprocess'
m = WithCustomEncoders(
    dt=datetime(2032, 6, 1, tzinfo=timezone.utc), diff=timedelta(minutes=2),
    diff2=timedelta(minutes=1)
)
print(m.model_dump_json())
# {"dt":1969660800.0,"diff":120.0,"diff2":"PT60Spostprocess"}

@model_serializer

  • (self, info: FieldSerializationInfo),mode=‘plain’
  • (self, nxt: SerializerFunctionWrapHandler, info: FieldSerializationInfo),mode=‘plain’
from typing import Dict, Any
from pydantic import BaseModel, model_serializer
from pydantic_core.core_schema import SerializerFunctionWrapHandler, SerializationInfo
class Model(BaseModel):
    x: str
    @model_serializer
    def ser_model(self, info: SerializationInfo):
        print(info)
        return {'x': f'xxxxxx {self.x}'}
    @model_serializer(mode='wrap')
    def ser_model_wrap(self, nxt: SerializerFunctionWrapHandler, info: SerializationInfo) -> Dict[str, Any]:
        print(info)
        return {'x': f'serialized {nxt(self)}'}
print(Model(x='test value').model_dump_json())
# {"x":"serialized {'x': 'test value'}"}

PlainSerializer和WrapSerializer

from typing import Any
from typing_extensions import Annotated
from pydantic import BaseModel, SerializerFunctionWrapHandler
from pydantic.functional_serializers import WrapSerializer, PlainSerializer
def ser_wrap(v: Any, nxt: SerializerFunctionWrapHandler) -> str:
    return f'{nxt(v + 1):,}'
FancyInt = Annotated[int, WrapSerializer(ser_wrap, when_used='json')]
DoubleInt = Annotated[int, PlainSerializer(lambda x: x * 2)]
class MyModel(BaseModel):
    x: FancyInt
    y: DoubleInt
print(MyModel(x=1234, y=2).model_dump())
# {'x': 1234, 'y': 4}
print(MyModel(x=1234, y=2).model_dump(mode='json'))
# {'x': '1,235', 'y': 4}

如何指定某個(gè)類型的序列化行為

在 pydantic v1 版本,configdict有個(gè)json_encoders參數(shù),可以配置指定類型的序列化行為。 在 pydantic v2 版本,不推薦json_encoders參數(shù),可使用如下方式

def serialize_datetime(value: datetime.datetime, __: SerializerFunctionWrapHandler, _: SerializationInfo):
    return value.strftime('%Y-%m-%d %H:%M:%S')
LocalDateTime = Annotated[datetime.datetime, WrapSerializer(serialize_datetime, when_used='json')]

按照聲明類型序列化,而不是實(shí)際類型

當(dāng)某個(gè)屬性的聲明類型是可序列化類型時(shí),如 BaseModel , dataclass , TypedDict 等,按照聲明類型序列化,而不是實(shí)際類型。如果想改變這種行為,可以使用 SerializeAsAny 。

from pydantic import BaseModel, SerializeAsAny
class User(BaseModel):
    name: str
class UserLogin(User):
    password: str
class OuterModel(BaseModel):
    # 聲明為User類型,按照User類序列化,只有name字段
    user: User
    user1: SerializeAsAny[User] = UserLogin(name='serialize as any', password='hunter')
# 實(shí)際類型為UserLogin
user = UserLogin(name='pydantic', password='hunter2')
m = OuterModel(user=user)
print(m)
# user=UserLogin(name='pydantic', password='hunter2') user1=UserLogin(name='serialize as any', password='hunter')
print(m.model_dump())
# {'user': {'name': 'pydantic'}, 'user1': {'name': 'serialize as any', 'password': 'hunter'}}

pickle

# TODO need to get pickling to work
import pickle
from pydantic import BaseModel
class FooBarModel(BaseModel):
    a: str
    b: int
m = FooBarModel(a='hello', b=123)
print(m)
#> a='hello' b=123
data = pickle.dumps(m)
print(data[:20])
#> b'\x80\x04\x95\x95\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main_'
m2 = pickle.loads(data)
print(m2)
#> a='hello' b=123

靈活的exclude和include

  • exclude,include支持集合,字典
  • 支持集合指定位置序列化或不序列化, exclude = {'items' :{0: True, -1: False} , include = {'items': {'__all__':{'id':False}}}
from pydantic import BaseModel, SecretStr
class User(BaseModel):
    id: int
    username: str
    password: SecretStr
class Transaction(BaseModel):
    id: str
    user: User
    value: int
t = Transaction(
    id='1234567890',
    user=User(id=42, username='JohnDoe', password='hashedpassword'),
    value=9876543210,
)
# using a set:
print(t.model_dump(exclude={'user', 'value'}))
#> {'id': '1234567890'}
# using a dict:
print(t.model_dump(exclude={'user': {'username', 'password'}, 'value': True}))
#> {'id': '1234567890', 'user': {'id': 42}}
print(t.model_dump(include={'id': True, 'user': {'id'}}))
#> {'id': '1234567890', 'user': {'id': 42}}

到此這篇關(guān)于Python中的Pydantic序列化詳解的文章就介紹到這了,更多相關(guān)Pydantic序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • scrapy redis配置文件setting參數(shù)詳解

    scrapy redis配置文件setting參數(shù)詳解

    這篇文章主要介紹了scrapy redis配置文件setting參數(shù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python時(shí)間日期相加減的實(shí)現(xiàn)示例

    python時(shí)間日期相加減的實(shí)現(xiàn)示例

    在實(shí)際開(kāi)發(fā)中,我們經(jīng)常需要對(duì)日期進(jìn)行加減操作,本文主要介紹了python時(shí)間日期相加減的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • python-opencv 將連續(xù)圖片寫(xiě)成視頻格式的方法

    python-opencv 將連續(xù)圖片寫(xiě)成視頻格式的方法

    今天小編就為大家分享一篇python-opencv 將連續(xù)圖片寫(xiě)成視頻格式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python 中如何獲取列表的索引

    python 中如何獲取列表的索引

    這篇文章主要介紹了python 中如何獲取列表的索引,在文中給大家提到了python 返回列表中某個(gè)值的索引,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python 處理微信對(duì)賬單數(shù)據(jù)的實(shí)例代碼

    python 處理微信對(duì)賬單數(shù)據(jù)的實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹了python 處理微信對(duì)賬單數(shù)據(jù),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python反射機(jī)制案例超詳細(xì)講解

    Python反射機(jī)制案例超詳細(xì)講解

    反射就是通過(guò)字符串的形式,導(dǎo)入模塊;通過(guò)字符串的形式,去模塊尋找指定函數(shù),并執(zhí)行。利用字符串的形式去對(duì)象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基于字符串的事件驅(qū)動(dòng)
    2022-09-09
  • Python遍歷目錄并批量更換文件名和目錄名的方法

    Python遍歷目錄并批量更換文件名和目錄名的方法

    這篇文章主要介紹了Python遍歷目錄并批量更換文件名和目錄名的方法,涉及Python針對(duì)文件與目錄的遍歷、讀取及修改等操作技巧,需要的朋友可以參考下
    2016-09-09
  • Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套

    Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套

    這篇文章主要介紹了Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套 的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 深入解析Flask應(yīng)用上下文報(bào)RuntimeError錯(cuò)誤的解決方法

    深入解析Flask應(yīng)用上下文報(bào)RuntimeError錯(cuò)誤的解決方法

    在使用?Flask?開(kāi)發(fā)后臺(tái)任務(wù)或多線程應(yīng)用時(shí),開(kāi)發(fā)者經(jīng)常會(huì)遇到?RuntimeError:?Working?outside?of?application?context?錯(cuò)誤,本文提供了三種解決方法,希望對(duì)大家有一定的幫助
    2025-05-05
  • Python開(kāi)發(fā)游戲自動(dòng)化后臺(tái)腳本的實(shí)現(xiàn)

    Python開(kāi)發(fā)游戲自動(dòng)化后臺(tái)腳本的實(shí)現(xiàn)

    本文主要介紹了Python開(kāi)發(fā)游戲自動(dòng)化后臺(tái)腳本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

乐亭县| 通渭县| 陆川县| 滕州市| 卢龙县| 望江县| 象山县| 额济纳旗| 利津县| 台北县| 华池县| 武乡县| 曲沃县| 景宁| 双桥区| 宁陵县| 二手房| 遂宁市| 始兴县| 温州市| 拜泉县| 兴文县| 拉孜县| 彭泽县| 沾益县| 新昌县| 博客| 嘉兴市| 民权县| 德江县| 历史| 山阳县| 丽水市| 兴海县| 涡阳县| 靖宇县| 台山市| 蓬溪县| 大渡口区| 台南县| 桐乡市|