色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

馬哥Linux運維 ? 來源:Hynek Schlawack ? 作者:Hynek Schlawack ? 2021-09-01 15:19 ? 次閱讀

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

誰應該都見過這個:

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

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

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

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

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

擴展性

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

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

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

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

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

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

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

進入PEP443

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

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

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

現在你也可以對datetime實例調用to_serializable()方法,singledispatch會選擇正確的函數

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

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

更深入一點

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

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

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

腳注

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

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

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

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

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

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

編輯:jq

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

    關注

    2

    文章

    1502

    瀏覽量

    62099
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62686
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68685
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84745
  • JSON
    +關注

    關注

    0

    文章

    119

    瀏覽量

    6977

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

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

收藏 人收藏

    評論

    相關推薦

    如何使用Python構建LSTM神經網絡模型

    構建LSTM(長短期記憶)神經網絡模型是涉及多個步驟的過程。以下是使用Python和Keras庫構建LSTM模型的指南。 1. 安裝
    的頭像 發表于 11-13 10:10 ?395次閱讀

    【每天學點AI】例子帶你了解Python裝飾器到底在干嘛!

    進行“加料”呢?Python裝飾器提供了更為優雅的方式來增強現有函數的行為,并且不需要修改現有的函數代碼及調用方式。接下來通過
    的頭像 發表于 09-20 16:54 ?564次閱讀
    【每天學點AI】<b class='flag-5'>一</b><b class='flag-5'>個</b>例子帶你了解<b class='flag-5'>Python</b>裝飾器到底在干嘛!

    【「時間序列與機器學習」閱讀體驗】時間序列的信息提取

    本章主講時間序列的信息提取,章節中有許多概念定義和數學公式,并配有Python代碼演示,細細品讀與理解動手演練,還是很開拓思維視野的。下面以筆記形式進行展開。 時間序列的信息提取是時間序列
    發表于 08-17 21:12

    【《時間序列與機器學習》閱讀體驗】+ 時間序列的信息提取

    、特征的范數歸一化。每個定義和命題都給出了證明過程和示例,示例還提供了Python代碼,方便學習。 以下是特征的最小最大縮放的示例數據和代碼: 由于我的本子有Python運行環境,編輯
    發表于 08-14 18:00

    【「時間序列與機器學習」閱讀體驗】全書概覽與時間序列概述

    他領域(如自然語言處理、計算機視覺等)的關聯。 ●第2章“時間序列的信息提取”:介紹特征工程的核心概念及其在時間序列分析中的廣用,比如對原始數據進行歸一化、缺失值填充等轉換;以及如何通過特征工程從時間
    發表于 08-07 23:03

    opencv-python和opencv樣嗎

    樣。OpenCV(Open Source Computer Vision Library)是開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Pytho
    的頭像 發表于 07-16 10:38 ?1222次閱讀

    python訓練出的模型怎么調用

    使用pickle模塊 pickle 是Python內置模塊,用于序列化和反序列化Python
    的頭像 發表于 07-11 10:15 ?2003次閱讀

    在全志H616核桃派1B開發板Python進行GPIO點燈

    前言? 按鍵是最簡單也最常見的輸入設備,很多產品都離不開按鍵,包括早期的iPhone,今天我們就來學習下如何使用Python來編寫按鍵程序。有了按鍵輸入功能,我們就可以做很多好玩的東西了。 實驗
    發表于 05-08 16:07

    在嵌入式系統中集成Rust和Qt的實踐

    Rust 擁有豐富的庫生態系統,用于序列化和反序列化、異步操作、解析不安全輸入、線程、靜態分析等,而 Qt 是 C++ 工具包,支持跨各種平臺的豐富的、基于 GUI 的應用程序,從
    發表于 05-03 10:26 ?1827次閱讀
    在嵌入式系統中集成Rust和Qt的實踐

    ROS機器人操作系統的實現原理

    面對序列化,很多人心中可能會有很多疑問。 首先,為什么要序列化?或者更具體的說,既然對象的信息本來就是以字節的形式儲存在內存中,那為什么要多此舉把
    的頭像 發表于 04-27 02:39 ?3396次閱讀
    ROS機器人操作系統的實現原理

    蘋果將允許維修部分iPhone使用二手原裝配件,但仍禁用第三方配件

    他指出,“零件序列化” 是廣為人知且常帶負面含義的詞匯。許多人誤解為蘋果阻止 iPhone 使用第三方零件,然而事實并非如此。蘋果的序列化匹配旨在確認設備中的部件真實性以及實現更精
    的頭像 發表于 04-12 14:22 ?435次閱讀

    Python自動測試框架及其應用

    Pytest是非常成熟的全功能的Python測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,功能更強大。
    的頭像 發表于 04-03 16:15 ?558次閱讀
    <b class='flag-5'>Python</b>自動<b class='flag-5'>化</b>測試框架及其應用

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    可以通過遞歸的方式拷貝傳輸對象,相較于其他序列化的算法,支持的對象類型更加豐富。 序列化支持的類型包括:除Symbol之外的基礎類型、Dat
    發表于 03-28 14:35

    俄勒岡州禁止數碼設備使用“序列化”技術

    該法案對諸如蘋果iPhone等數字產品產生巨大影響,意即制造商無法利用“零件序列化”技術束縛消費者選擇第三方維修服務或自主修復非原產部件,同時也不能以此減少設備性能或誤導使用者。
    的頭像 發表于 03-28 10:46 ?543次閱讀

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    可以通過遞歸的方式拷貝傳輸對象,相較于其他序列化的算法,支持的對象類型更加豐富。 序列化支持的類型包括:除Symbol之外的基礎類型、Dat
    發表于 03-22 15:40
    主站蜘蛛池模板: 国产精人妻无码一区麻豆| 体内精69xxxxxx喷潮| 97伦理97伦理2018最新| 特黄特黄aaaa级毛片免费看| 久久热这里只有 精品| 丰满的女朋友韩国版在线观看| 夜色福利院在线观看免费| 日日噜噜夜夜躁躁狠狠| 两性午夜色视频免费网站| 国产亚洲精品久久久久| 成年人国产视频| 97在线精品视频| 亚洲在线成色综合网站| 婷婷五月久久丁香国产综合| 欧美16一17sex性hd| 久久精品黄色| 好男人WWW免费高清视频在线| 国产成人精品永久免费视频| 99在线这精品视频| 中文字幕在线播放视频| 亚洲精品国产SUV| 婷婷精品国产亚洲AV在线观看| 欧美日韩国产码在线| 久久免费电影| 九九99热久久999精品| 国产特级毛片AAAAAAA高清| 高清观看ZSHH96的视频素材| jaPanesmature儿母| 18美女腿打开无遮软件| 一手揉着乳头一手模仿抽插视频| 贤妻良母电影日本| 爽爽影院免费观看| 青青视频国产依人在线| 年轻的的小婊孑2中文字幕| 伦理片97影视网| 毛片无码免费无码播放| 久久久无码精品亚洲A片软件| 精品国产成a人在线观看| 国产香蕉视频在线播放| 国产亚洲AV无码成人网站| 国产欧美精品一区二区色综合 |