当前位置: 首页 > news >正文

cls(**dict(data, id=id))灵活地从一个字典生成实例,同时确保某些关键字段(如 id)被正确设置或覆盖

示例代码:

 @classmethod
    def 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 = name
              self.age = age
              self.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 = name
            self.age = age
            self.id = id
    
        def __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)被正确设置或覆盖。

相关文章:

  • 问deepseek: 如何用CUDA实现PBiCGSTAB稀疏矩阵迭代算法,写段示例代码
  • OLE注册是什么?
  • 博客图床 VsCode + PicGo + 阿里云OSS
  • $.ajax的contentType设置及对应后端数据获取方式
  • ViT、DETR 和 Swin Transformer :基于 Transformer 的计算机视觉(CV)模型
  • vmware tools灰化
  • Unity打包的WebGL包打不开问题解决方案,以及WebGL包嵌入至Vue2中的步骤
  • QT程序双击可执行文件运行方法
  • vue3 引入element-plus组件后,发现输入的时候没有提示,而且鼠标移到el-button显示unknown的简单解决方法
  • 【谷粒商城踩坑记】第四坑 nacos 闪退问题
  • python 库笔记:pytorch-tcn
  • vue的绑定
  • 单片机开发资源分析的实战——以STM32G431RBT6为例子的单片机资源分析
  • Zabbix—企业微信报警群通消息通知
  • Doris:联邦认证
  • 新安装的cursor安装不了插件
  • 2025-3-17 腾讯云-大数据方向-成都面试
  • JavaScript变量声明与DOM操作指南
  • Vue.js 插槽(Slot)详解:让组件更灵活、更强大
  • OracleCdc和MysqlCdc区别详解
  • 中国防疫队深入缅甸安置点开展灾后卫生防疫工作
  • IMF前副总裁朱民捐赠1000万元,在复旦设立青云学子基金
  • 中国农业国际交流协会会长王守聪失联已逾半年,协会启动罢免
  • 招行一季度净利372.86亿降2.08%,营收降逾3%
  • 安徽省公安厅原副厅长刘海石主动投案,正接受审查调查
  • 怒江州委常委、泸水市委书记余剑锋调任云南省委省直机关工委副书记