cls(**dict(data, id=id))靈活地從一個字典生成實例,同時確保某些關鍵字段(如 id)被正確設置或覆蓋

示例代碼:

 @classmethoddef from_mongo(cls: Type[T], data: dict) -> T:"""Convert "_id" (str object) into "id" (UUID object)."""if not data:raise ValueError("Data is empty.")id = data.pop("_id")return cls(**dict(data, id=id))

這段代碼分成兩部分來理解:

  1. dict(data, id=id) 部分:

    • 作用:
      這里調用了 Python 內置的 dict() 構造函數,它接受一個已有的字典(這里是 data)以及額外的關鍵字參數(這里是 id=id)。
    • 效果:
      它會創建一個新的字典,這個字典包含 data 中的所有鍵值對,同時如果 data 中已經有 id 鍵,那么它會被新傳入的 id 覆蓋;如果沒有,則會新增一個 id 鍵。
    • 舉例說明:
      假設:
      data = {"name": "Alice", "age": 30}
      id_value = "123e4567-e89b-12d3-a456-426614174000"
      
      那么 dict(data, id=id_value) 生成的新字典就是:
      {"name": "Alice","age": 30,"id": "123e4567-e89b-12d3-a456-426614174000"
      }
      
      如果 data 原來已經有一個 id 鍵,例如:
      data = {"name": "Alice", "age": 30, "id": "old-id"}
      
      則執行 dict(data, id=id_value) 后,新字典中 "id" 的值將變為 "123e4567-e89b-12d3-a456-426614174000",覆蓋原來的 "old-id"
  2. cls(…) 部分:**

    • 作用:
      這里的 cls 通常代表當前類(比如在一個類方法中用 cls 來引用類本身),** 是解包運算符。
    • 效果:
      當你寫 cls(**some_dict) 時,相當于把字典 some_dict 中的每個鍵值對都作為關鍵字參數傳給類的構造方法。
    • 舉例說明:
      假設我們有一個類 User 定義如下:
      class User:def __init__(self, name, age, id):self.name = nameself.age = ageself.id = id
      
      如果有字典:
      user_data = {"name": "Alice","age": 30,"id": "123e4567-e89b-12d3-a456-426614174000"
      }
      
      那么調用 User(**user_data) 就等價于:
      User(name="Alice", age=30, id="123e4567-e89b-12d3-a456-426614174000")
      

綜合解釋 cls(**dict(data, id=id)):

  • 首先,dict(data, id=id) 會生成一個新的字典,這個字典包含了 data 中所有的鍵值對,并確保鍵 "id" 的值被更新為變量 id 的值。
  • 然后,cls(**dict(...)) 會調用類 cls 的構造方法,把這個字典中的鍵值對逐個傳入作為命名參數,從而創建并返回一個新的類實例。

通俗舉例:

假設有如下情況:

  • data = {"name": "Bob", "age": 25}
  • id = "uuid-0001"
  • Person 定義為:
    class Person:def __init__(self, name, age, id):self.name = nameself.age = ageself.id = iddef __repr__(self):return f"Person(name={self.name}, age={self.age}, id={self.id})"
    

那么,執行 Person(**dict(data, id=id)) 的過程如下:

  1. 生成新字典:
    dict(data, id=id) 得到:
    {"name": "Bob", "age": 25, "id": "uuid-0001"}
    
  2. 調用構造函數:
    Person(**{"name": "Bob", "age": 25, "id": "uuid-0001"}) 就相當于執行:
    Person(name="Bob", age=25, id="uuid-0001")
    
  3. 創建實例:
    得到一個 Person 對象,其屬性分別為 name="Bob", age=25, id="uuid-0001"

這樣寫的好處是可以靈活地從一個字典生成實例,同時確保某些關鍵字段(如 id)被正確設置或覆蓋。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyBatis XMLMapperBuilder 是如何將 SQL 語句解析成可執行的對象? 如何將結果映射規則解析成對應的處理器?

1. XMLMapperBuilder 如何將 SQL 語句解析成可執行對象 (MappedStatement): XMLMapperBuilder 解析 <select>, <insert>, <update>, <delete> 等 SQL 語句元素時&#xff0c;并不僅僅是簡單地讀取 SQL 文本&#xff0c;而是要將 SQL 語句和相關的配置…

咖啡點單小程序畢業設計(JAVA+SpringBoot+微信小程序+完整源碼+論文)

?全網粉絲20W,csdn特邀作者、博客專家、CSDN新星計劃導師、java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取項目下載方式&#x1f345; 一、項目背景介紹&#xff1a; 隨著社會的快速發展和…

003-掌控命令行-CLI11-C++開源庫108杰

首選的現代C風格命令行參數解析器! &#xff08;本課程包含兩段教學視頻。&#xff09; 以文件對象監控程序為實例&#xff0c;五分鐘實現從命令行讀入多個監控目標路徑&#xff1b;區分兩大時機&#xff0c;學習 CLI11 構建與解析參數兩大場景下的異常處理&#xff1b;區分三…

【leetcode hot 100 124】二叉樹中的最大路徑和

解法一&#xff1a;&#xff08;遞歸&#xff09;考慮實現一個簡化的函數 maxGain(node)&#xff0c;該函數計算二叉樹中的一個節點的最大貢獻值&#xff0c;具體而言&#xff0c;就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑&#xff0c;使得該路徑上的節點值…

譜分析方法

前言 本文隸屬于專欄《機器學習數學通關指南》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見《機器學習數學通關指南》 ima 知識庫 知識庫廣場搜索&#…

在圖像/視頻中裁剪出人臉區域

1. 在圖像中裁剪人臉區域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…

【軟考-架構】11.3、設計模式-新

?資料&文章更新? GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目錄 項目中的應用設計模式創建型設計模式結構型設計模式行為型設計模式 &#x1f4af;考試真題題外話 項目中的應用 在實際項目中&#xff0c;我應用過多種設計模式來解決不同…

使用Redis如何實現分布式鎖?(超賣)

分布式鎖概念 在多線程環境下&#xff0c;為了保證數據的線程安全&#xff0c;鎖保證同一時刻&#xff0c;只有一個可以訪問和更新共享數據。在單機系統我們可以使用 synchronized 鎖、Lock 鎖保證線程安全。 synchronized 鎖是 Java 提供的一種內置鎖&#xff0c;在單個 JVM …

Linux的Shell編程

一、什么是Shell 1、為什么要學習Shell Linux運維工程師在進行服務器集群管理時&#xff0c;需要編寫Shell程序來進行服務器管理。 對于JavaEE和Python程序員來說&#xff0c;工作的需要。Boss會要求你編寫一些Shell腳本進行程序或者是服務器的維護&#xff0c;比如編寫一個…

使用React和google gemini api 打造一個google gemini應用

實現一個簡單的聊天應用&#xff0c;用戶可以通過輸入問題或點擊“Surprise me”按鈕獲取隨機問題&#xff0c;并從后端API獲取回答。 import { useState } from "react"; function App() {const [ value, setValue] useState(""); // 存儲用戶輸入的問題…

深入探討TK矩陣系統:創新的TikTok運營工具

TK矩陣的應用場景 TK矩陣系統適用于多個場景&#xff0c;尤其是在以下幾個方面有顯著優勢&#xff1a; 批量賬號管理與內容發布&#xff1a;對于需要管理多個TikTok賬號的內容創作者或營銷人員&#xff0c;TK矩陣提供了高效的賬號管理工具&#xff0c;支持批量發布視頻、評論、…

MTK Android12 應用在最頂端時,禁止拉起其他某個應用(一)

1、需求 近期&#xff0c;客戶要求應用在最頂端時&#xff0c;禁止拉起其他某個應用2、解決方法 diff --git a/frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java b/frameworks/base/services/core/java/com/android/server/wm/ActivityStarte…

論文閱讀筆記:Deep Unsupervised Learning using Nonequilibrium Thermodynamics

1、來源 論文連接1&#xff1a;http://ganguli-gang.stanford.edu/pdf/DeepUnsupDiffusion.pdf 論文連接2(帶appendix)&#xff1a;https://arxiv.org/pdf/1503.03585v7 代碼鏈接&#xff1a;https://github.com/Sohl-Dickstein/Diffusion-Probabilistic-Models 代碼的環境配置…

7種數據結構

7種數據結構 順序表sqlite.hseqlite.c 單鏈表linklist.clinklist.h 雙鏈表doulinklist.cdoulinklist.h 鏈式棧linkstack.clinkstack.h 隊列SeqQueue.cSeqQueue.h 樹tree.c 哈希表hash.c 順序表 sqlite.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef struct person…

Linux 查看及測試網絡命令

使用 ifconfig 命令查看網絡接口地址 查看指定的網絡接口信息 執行 ifconfig ens33 命令可以只查看網卡 ens33 的配置信息

ABAP語言的動態編程(4) - 綜合案例:管理費用明細表

本篇來實現一個綜合案例&#xff1a;管理費用明細表。報表在實際項目中&#xff0c;也有一定的參考意義&#xff0c;一方面展示類似的報表&#xff0c;比如管理費用、研發費用等費用的明細&#xff0c;使用業務比較習慣的展示格式&#xff1b;另一方面正好綜合運用前面學習的動…

【Redis】Redis的數據刪除(過期)策略,數據淘汰策略。

如果問到&#xff1a;假如Redis的key過期之后&#xff0c;會立即刪除嗎&#xff1f; 其實就是想問數據刪除(過期)策略。 如果面試官問到&#xff1a;如果緩存過多&#xff0c;內存是有限的&#xff0c;內存被占滿了怎么辦&#xff1f; 其實就是問&#xff1a;數據的淘汰策略。…

Linux配置yum倉庫,服務控制,防火墻

一、yum倉庫 1.在安裝軟件時&#xff0c;首先第一步就是要考慮軟件的版本的問題&#xff01; 2.軟件的安裝&#xff1a;最安全可靠的方法就是去軟件對應的官網上查看安裝手冊&#xff08;包括的軟件的下載&#xff09; 紅帽系軟件安裝的常見的3種方式 &#xff08;1&#x…

[從零開始學習JAVA] Stream流

前言&#xff1a; 本文我們將學習Stream流&#xff0c;他就像流水線一樣&#xff0c;可以對我們要處理的對象進行逐步處理&#xff0c;最終達到我們想要的效果&#xff0c;是JAVA中的一大好幫手&#xff0c;值得我們了解和掌握。&#xff08;通常和lambda 匿名內部類 方法引用相…

設計模式(創建型)-抽象工廠模式

摘要 在軟件開發的復雜世界中,設計模式作為解決常見問題的最佳實踐方案,一直扮演著至關重要的角色。抽象工廠模式,作為一種強大的創建型設計模式,在處理創建一系列或相關依賴對象的場景時,展現出了獨特的優勢和靈活性。它通過提供一個創建對象的接口,讓開發者能夠在不指定…