在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

分享一個(gè)最新的的Python對(duì)象序列化方式

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

掃碼添加小助手

加入工程師交流群

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

誰(shuí)應(yīng)該都見過(guò)這個(gè):

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

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

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

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

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

擴(kuò)展性

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

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

這看起來(lái)非常痛苦,因?yàn)槟阈枰谝粋€(gè)地方為所有不同類型對(duì)象增加序列化結(jié)果2。

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

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

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

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

進(jìn)入PEP443

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

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

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

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

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

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

更深入一點(diǎn)

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

換句話說(shuō),@singledispatch就是一個(gè)長(zhǎng)久以來(lái)就存在的但是卻被你忽略的函數(shù)。

P.S. 當(dāng)然,PyPI中也有一個(gè)*multiple*dispatch。

腳注

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

2. 利用attrs是可以很好管理的!也許你應(yīng)當(dāng)使用attrs!

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

4. 我聽說(shuō)將singlepatch加進(jìn)標(biāo)準(zhǔn)庫(kù)的最原始動(dòng)力來(lái)自于對(duì)pprint的一個(gè)更優(yōu)雅的實(shí)現(xiàn)(雖然從來(lái)沒有實(shí)現(xiàn)過(guò))

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

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

編輯:jq

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

    關(guān)注

    2

    文章

    1566

    瀏覽量

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

    關(guān)注

    3

    文章

    4376

    瀏覽量

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

    關(guān)注

    30

    文章

    4892

    瀏覽量

    70428
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86434
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    7326

原文標(biāo)題:更好的Python對(duì)象序列化方式

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    TaskPool和Worker的對(duì)比分析

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

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

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

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

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

    spartan 6 14位LVDS 反序列化

    spartan 6系列的FPGA 與14位ADC 輸出LVDS信號(hào) 怎么實(shí)現(xiàn)1:14的串轉(zhuǎn)并呢?iserdes2 在ise里面最高只能實(shí)現(xiàn)8位啊
    發(fā)表于 04-25 15:20

    什么是SerDes?SerDes有哪些應(yīng)用?

    SerDes是種功能塊,用于對(duì)高速芯片間通信中使用的數(shù)字數(shù)據(jù)進(jìn)行序列化和反序列化。用于高性能計(jì)算(HPC)、人工智能(AI)、汽車、移動(dòng)和物聯(lián)網(wǎng)(IoT)應(yīng)用的現(xiàn)代片上系統(tǒng)(SoC
    的頭像 發(fā)表于 03-27 16:18 ?1696次閱讀
    什么是SerDes?SerDes有哪些應(yīng)用?

    使用Yolo-v3-TF運(yùn)行OpenVINO?對(duì)象檢測(cè)Python演示時(shí)的結(jié)果不準(zhǔn)確的原因?

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

    無(wú)法在Windows Subsystem for Linux 2上使用對(duì)象檢測(cè)Python演示運(yùn)行YoloV4模型?

    在 WSL2 上運(yùn)行對(duì)象檢測(cè) python 演示。 使用 CPU 運(yùn)行 object_detection_demo.py 時(shí)遇到錯(cuò)誤: OpenCV: FFMPEG: tag
    發(fā)表于 03-05 08:43

    對(duì)象存儲(chǔ)是什么結(jié)構(gòu)類型?

    對(duì)象存儲(chǔ)屬于非結(jié)構(gòu)數(shù)據(jù)存儲(chǔ)架構(gòu),采用扁平命名空間結(jié)構(gòu)。其核心通過(guò)唯標(biāo)識(shí)符(ObjectID)定位數(shù)據(jù)對(duì)象,突破傳統(tǒng)文件系統(tǒng)的層級(jí)目錄限
    的頭像 發(fā)表于 02-10 11:14 ?299次閱讀

    如何使用Python構(gòu)建LSTM神經(jīng)網(wǎng)絡(luò)模型

    構(gòu)建個(gè)LSTM(長(zhǎng)短期記憶)神經(jīng)網(wǎng)絡(luò)模型是個(gè)涉及多個(gè)步驟的過(guò)程。以下是使用Python和Keras庫(kù)構(gòu)建LSTM模型的指南。 1. 安裝
    的頭像 發(fā)表于 11-13 10:10 ?1494次閱讀

    【每天學(xué)點(diǎn)AI】個(gè)例子帶你了解Python裝飾器到底在干嘛!

    進(jìn)行“加料”呢?Python裝飾器提供了個(gè)更為優(yōu)雅的方式來(lái)增強(qiáng)現(xiàn)有函數(shù)的行為,并且不需要修改現(xiàn)有的函數(shù)代碼及調(diào)用方式。接下來(lái)通過(guò)
    的頭像 發(fā)表于 09-20 16:54 ?769次閱讀
    【每天學(xué)點(diǎn)AI】<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>例子帶你了解<b class='flag-5'>Python</b>裝飾器到底在干嘛!

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】時(shí)間序列的信息提取

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

    【《時(shí)間序列與機(jī)器學(xué)習(xí)》閱讀體驗(yàn)】+ 時(shí)間序列的信息提取

    、特征的范數(shù)歸一化。每個(gè)定義和命題都給出了證明過(guò)程和示例,示例還提供了Python代碼,方便學(xué)習(xí)。 以下是特征的最小最大縮放的示例數(shù)據(jù)和代碼: 由于我的本子有Python運(yùn)行環(huán)境,編輯
    發(fā)表于 08-14 18:00

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】全書概覽與時(shí)間序列概述

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

    opencv-python和opencv樣嗎

    樣。OpenCV(Open Source Computer Vision Library)是個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫(kù),它提供了大量的圖像和視頻處理功能。OpenCV-Pytho
    的頭像 發(fā)表于 07-16 10:38 ?2017次閱讀

    python訓(xùn)練出的模型怎么調(diào)用

    使用pickle模塊 pickle 是Python個(gè)內(nèi)置模塊,用于序列化和反序列化Python
    的頭像 發(fā)表于 07-11 10:15 ?3289次閱讀
    主站蜘蛛池模板: 亚洲欧美成人 | 四虎精品影院2022 | 久久综合狠狠综合久久综合88 | 久久亚洲一级毛片 | 欧美18videosex性欧美69 | 婷婷六月激情 | 色老头·com 色老头成人免费综合视频 色老头久久久久 | 日本一区二区三区四区视频 | 免费亚洲视频在线观看 | 亚洲综合视频一区 | 老湿司午夜爽爽影院榴莲视频 | 精品美女在线观看 | 成人a一级毛片免费看 | 人人草草| 日本免费黄色大片 | 欧美视频一区二区三区四区 | 国产色爽女 | 97夜夜澡人人爽人人喊一欧美 | 国产午夜精品一区二区理论影院 | 天天摸天天看天天做天天爽 | 一级看片 | 日本特黄特色大片免费播放视频 | 正在播放羽月希与黑人bd在线 | 4hc44www四虎永久| 日本aaaaa | 亚洲另类电击调教在线观看 | 特色一级黄色片 | 777色狠狠一区二区三区香蕉 | 天天插天天干天天操 | 午夜视频网站在线观看 | 久久精品男人影院 | 韩国中文字幕在线观看 | 综合网在线观看 | 三级四级特黄在线观看 | 性生交大片免费一级 | 老汉影视永久免费视频 | 国产高清美女一级a毛片 | 欧美午夜在线视频 | 亚洲第一区二区快射影院 | 欧美黑人黄色片 | 激情91|