91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享一個最新的的Python對象序列化方式

馬哥Linux運維 ? 來源:Hynek Schlawack ? 作者:Hynek Schlawack ? 2021-09-01 15:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

許多Python標準庫都有一些未被賞識的精華。其中之一是允許簡單優(yōu)雅的基于參數(shù)類型的函數(shù)分發(fā)。這一特性對于任意對象的序列化而言是非常完美的——例如對于web API的JSON或結(jié)構(gòu)化日志而言。

誰應該都見過這個:

9b2e5f14-0acf-11ec-911a-12bb97331649.png

雖然這不是什么大問題。json模塊(API繼承自simplejson)提供了兩種方式來序列化對象:

1. 實現(xiàn)一個default()函數(shù),它接收一個對象作為參數(shù)并且返回可以被JSONEncoder理解的東西;

2. 你自己實現(xiàn)或子類化一個JSONEncoder,并且把它作為cls傳遞給dump方法。你可以自己實現(xiàn)它或者簡單地重寫JSONEncoder.default()方法。

由于一些第三方的實現(xiàn)希望能夠被大多數(shù)程序兼容,所以他們都不同程度的模仿了json模塊的API1。

擴展性

所有上述方法的共性是它們不具有擴展性:不提供對新類型的支持。你的default()函數(shù)需要知道所有你想要序列化的自定義類型。這意味著你或者像這樣寫你的函數(shù):

9b3d44ac-0acf-11ec-911a-12bb97331649.jpg

這看起來非常痛苦,因為你需要在一個地方為所有不同類型對象增加序列化結(jié)果2。

或者另一種方法,你可以自己嘗試提出一種一般性的解決方案,就像Pyramid的JSON渲染器在JSON.add_adapter中做的一樣,它使用了被廣泛低估的zope.interface的適配器注冊表3。

另一方面,Django自己實現(xiàn)了一個DjangoJSONEncoder,它是json.JSONEncoder的子類,它知道如何去編碼日期,時間,UUID和premise等。但是除此之外,你又需要依靠自己了。如果你想深入研究Django和web API,那么你可能已經(jīng)準備好使用Django的REST框架了。它們實現(xiàn)了一整套序列化系統(tǒng),它比僅僅讓數(shù)據(jù)進行json.dump()做了更多的工作。

最后,為了完整性,我感覺我不得不提到我自己在我第一天開始就極其討厭的structlog中的解決方案:為你的類增加一個__structlog__方法,它會像__str__一樣返回一個序列化后的表示方法。請不要重復我的錯誤。標簽:software clown。

JSON已經(jīng)很流行了,然而很奇怪的是我們對于序列化的解決方案卻仍舊不夠完善。我個人想要的是能夠注冊一個中心化的序列化工具,但是卻以一個去中心化的方式來使用,這樣可以不需要對我的類(或者更糟的,第三方類)進行任何修改。

進入PEP443

Python3.4以PEP 443的形式給出了對這個問題的一個好的解決方案:functools.singledispatch(老式Python版本也可以在PyPI上找到)。

簡單說,你可以定義一個默認的函數(shù)然后根據(jù)第一個參數(shù)的類型注冊一個該函數(shù)的額外版本:

9b57351a-0acf-11ec-911a-12bb97331649.jpg

現(xiàn)在你也可以對datetime實例調(diào)用to_serializable()方法,singledispatch會選擇正確的函數(shù)

9b634044-0acf-11ec-911a-12bb97331649.png

這一方法讓你能夠把你的序列化器放在任何你想放的位置:放在類里,在一個獨立的模塊里,或者放在JSON相關(guān)的代碼里。你自己選!但是你的類要保持干凈,并且你不需要巨大的繁瑣的if-elif-else分支。

更深入一點

顯然,@singledispatch的使用比JSON更加深入。一般而言,為不同類型的對象綁定不同的行為以及獨立的序列化方式是普遍適用的4。我的一些校對員提到了他們嘗試了采用字典類近似替代可調(diào)用對象以及其他一些類似的“殘暴的”做法。

換句話說,@singledispatch就是一個長久以來就存在的但是卻被你忽略的函數(shù)。

P.S. 當然,PyPI中也有一個*multiple*dispatch。

腳注

1. 然而,對于非常出名的一個:UltraJSON一點都不支持自定義對象的序列化,此外,python-rapidjson僅僅支持default()函數(shù)。

2. 利用attrs是可以很好管理的!也許你應當使用attrs!

3. 不幸的是Pyramid使用的API自從zope.component移植過來之后還沒有形成文檔。

4. 我聽說將singlepatch加進標準庫的最原始動力來自于對pprint的一個更優(yōu)雅的實現(xiàn)(雖然從來沒有實現(xiàn)過)

原文鏈接:https://hynek.me/articles/serialization/

(版權(quán)歸原作者所有,侵刪)

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    2368

    瀏覽量

    66752
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67499
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73954
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90022
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    128

    瀏覽量

    7780

原文標題:更好的Python對象序列化方式

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    JSON:簡潔代碼高效搞定序列化與反序列化

    面對頻繁的數(shù)據(jù)交互需求,用最簡方式實現(xiàn)JSON序列化與反序列化已成為開發(fā)者必備技能,借助主流庫,輕松實現(xiàn)零負擔數(shù)據(jù)轉(zhuǎn)換。JSON(JavaScriptObjectNotation)是
    的頭像 發(fā)表于 02-25 19:04 ?88次閱讀
    JSON:簡潔代碼高效搞定<b class='flag-5'>序列化</b>與反<b class='flag-5'>序列化</b>

    IO序列化操作:提升系統(tǒng)互操作性的關(guān)鍵技術(shù)

    在異構(gòu)系統(tǒng)并存的今天,IO序列化操作成為實現(xiàn)系統(tǒng)間互操作性的核心技術(shù)。通過標準的數(shù)據(jù)格式(如JSON、Protobuf、Hessian等),不同語言、平臺的系統(tǒng)得以無縫交換信息。合理設(shè)計序列化策略
    的頭像 發(fā)表于 02-25 16:02 ?46次閱讀
    IO<b class='flag-5'>序列化</b>操作:提升系統(tǒng)互操作性的關(guān)鍵技術(shù)

    【ioqueue】 IO序列化操作全解析

    從內(nèi)存對象到可存儲或可傳輸?shù)淖止?jié)流,IO序列化操作完成了數(shù)據(jù)形態(tài)的轉(zhuǎn)化。這過程不僅涉及編碼與解碼邏輯,還需處理版本兼容、安全性與性能開銷等問題。全面掌握這技術(shù)路徑,有助于構(gòu)建更加健
    的頭像 發(fā)表于 02-24 19:22 ?77次閱讀
    【ioqueue】 IO<b class='flag-5'>序列化</b>操作全解析

    極簡代碼,搞定JSON序列化與反序列化

    快速實現(xiàn)JSON數(shù)據(jù)的生成(序列化)與解析(反序列化)。 目前json庫已全面支持LuatOS開發(fā)系列產(chǎn)品,開發(fā)者可根據(jù)項目實際需求,靈活選用并進行快速集成與開發(fā)。 、 JSON基礎(chǔ)要點 在
    的頭像 發(fā)表于 02-23 21:46 ?325次閱讀
    極簡代碼,搞定JSON<b class='flag-5'>序列化</b>與反<b class='flag-5'>序列化</b>

    深入剖析LMH0030:SMPTE標準數(shù)字視頻序列化器的卓越之選

    深入剖析LMH0030:SMPTE標準數(shù)字視頻序列化器的卓越之選 在當今數(shù)字的時代,數(shù)字視頻處理技術(shù)日新月異。對于電子工程師而言,選擇款性能卓越、功能豐富的數(shù)字視頻序列化器至關(guān)重要
    的頭像 發(fā)表于 12-30 14:00 ?285次閱讀

    深入解析LM2512A:高性能RGB顯示接口序列化

    深入解析LM2512A:高性能RGB顯示接口序列化器 在電子設(shè)備的顯示領(lǐng)域,如何高效、穩(wěn)定地傳輸高質(zhì)量的圖像數(shù)據(jù)是關(guān)鍵問題。TI的LM2512A作為款專門的移動像素鏈路(MPL
    的頭像 發(fā)表于 12-26 11:30 ?407次閱讀

    SN65HVS885:工業(yè)自動的理想數(shù)字輸入序列化

    SN65HVS885:工業(yè)自動的理想數(shù)字輸入序列化器 在工業(yè)和建筑自動領(lǐng)域,對于高通道密度數(shù)字輸入模塊的需求日益增長。德州儀器(TI)的SN65HVS885作為款八通道數(shù)字輸入
    的頭像 發(fā)表于 12-25 11:00 ?440次閱讀

    深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 橋接序列化

    深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 橋接序列化器 在電子工程師的日常工作中,選擇款合適的器件來實現(xiàn)特定功能至關(guān)重要。今天,我們聚焦于德州儀器(TI
    的頭像 發(fā)表于 12-22 15:50 ?347次閱讀

    DS90UH947-Q1:1080p OpenLDI至FPD - Link III序列化器的深度解析

    迫切。DS90UH947 - Q1 作為款專為汽車應用等場景打造的 1080p OpenLDI 至 FPD - Link III 序列化器,憑借其卓越的性能和豐富的功能,在市場上占據(jù)了重要的
    的頭像 發(fā)表于 12-22 15:40 ?320次閱讀

    探索DS90UH981-Q1:4K DSI到FPD-Link IV橋接序列化器的卓越性能

    探索DS90UH981-Q1:4K DSI到FPD-Link IV橋接序列化器的卓越性能 在當今的電子設(shè)備設(shè)計領(lǐng)域,對于高速、可靠且功能強大的視頻傳輸解決方案的需求與日俱增。DS90UH981-Q1
    的頭像 發(fā)表于 12-17 11:15 ?442次閱讀

    輕量級參數(shù)的管理框架(C語言)

    和反序列化操作。 方便在本地儲存設(shè)備(如flash、eeprom等)保存/讀取二進制數(shù)據(jù),甚至還可以跨設(shè)備傳輸使用 提供了兩種方式: 第種:只需要提供參數(shù)數(shù)據(jù)保存/加載的回調(diào)函數(shù),調(diào)用相關(guān)接口函數(shù)
    發(fā)表于 12-16 06:24

    TaskPool和Worker的對比分析

    TaskPoolWorker內(nèi)存模型線程間隔離,內(nèi)存不共享。線程間隔離,內(nèi)存不共享。 參數(shù)傳遞機制采用標準的結(jié)構(gòu)克隆算法(Structured Clone)進行序列化、反序列化,完成參數(shù)傳遞。 支持ArrayBuffer
    發(fā)表于 06-18 06:43

    鴻蒙5開發(fā)寶藏案例分享---跨線程性能優(yōu)化指南

    發(fā)現(xiàn)鴻蒙寶藏:跨線程序列化性能優(yōu)化實戰(zhàn)指南 大家好呀!今天在翻鴻蒙文檔時挖到超級實用的工具—— DevEco Profiler的序列化檢測功能 !平時用<span class
    發(fā)表于 06-12 17:13

    快手上線鴻蒙應用高性能解決方案:數(shù)據(jù)反序列化性能提升90%

    普通對象(如 JSON 數(shù)據(jù))與類實例進行互轉(zhuǎn),是實現(xiàn)面向對象編程與數(shù)據(jù)序列化解耦的核心工具。隨著業(yè)務復雜度的提升,該庫在反序列化過程中逐漸暴露出性能瓶頸,影響用戶核心體驗。因此
    發(fā)表于 05-15 10:01

    使用Yolo-v3-TF運行OpenVINO?對象檢測Python演示時的結(jié)果不準確的原因?

    的模型與對象檢測 Python* Demo 配合使用時無法檢測對象python3 open_model_zoo/demos/object_detection_demo/
    發(fā)表于 03-06 06:31