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.mzph.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 匿名内部类 方法引用相…

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…