从 dataclass 转到 dict 可以用 asdict 函数 , 反向转换的时候 就比较困难. 不用外部的包的情况下, 提供一种思路.

  1. def mask(v, d): #v 是 dict 数据, d 是 @dataclass 类型
  2. if isinstance(v, d):
  3. pass
  4. elif isinstance(v, Dict):
  5. x = [v.get(k, None) for k in [i for i in d.__dict__['__annotations__']]]
  6. y = list(d.__init__.__defaults__)
  7. if len(y) > 0:
  8. n = len(x)
  9. m = len(y)
  10. for i in range(m):
  11. if x[n-m+i] is None:
  12. x[n-m+i] = y[i]
  13. x = tuple(x)
  14. v = d(*x)
  15. else:
  16. v = None
  17. return v

以上是转换用的函数, 用于处理 输入参数为dict形式

  1. from dataclasses import dataclass, asdict
  2. from typing import Dict
  3. def mask(v, d): #v 是 dict 数据, d 是 @dataclass 类型
  4. if isinstance(v, d):
  5. pass
  6. elif isinstance(v, Dict):
  7. x = [v.get(k, None) for k in [i for i in d.__dict__['__annotations__']]]
  8. y = list(d.__init__.__defaults__)
  9. if len(y) > 0:
  10. n = len(x)
  11. m = len(y)
  12. for i in range(m):
  13. if x[n-m+i] is None:
  14. x[n-m+i] = y[i]
  15. x = tuple(x)
  16. v = d(*x)
  17. else:
  18. v = None
  19. return v
  20. @dataclass
  21. class ddd:
  22. a: str
  23. c: str = ""
  24. b: str = ""
  25. @dataclass
  26. class bbb:
  27. a: str
  28. b: ddd = None
  29. c: str = ""
  30. def __post_init__(self):
  31. self.b=mask(self.b,ddd)
  32. @dataclass
  33. class aaa:
  34. a: str
  35. b: str
  36. c: bbb = None
  37. def __post_init__(self):
  38. self.c=mask(self.c, bbb)
  39. if __name__=="__main__":
  40. x = aaa(1, 2, {'a': 4, 'b': {'a':6,'c':7}})
  41. y = asdict(x) print(mask(y,aaa))

结果是 :

aaa(a=1, b=2, c=bbb(a=4, b=ddd(a=6, c=7, b=''), c=''))

从 Dict 转到 Dataclass的更多相关文章

  1. Python3.7 dataclass 介绍

    Posted on 2018年6月28日 by laixintao 1 Comment Python3.7 加入了一个新的 module:dataclasses.可以简单的理解成“支持默认值.可以修改 ...

  2. tuple放入dict中

    tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...

  3. redis数据结构存储Dict设计细节(redis的设计与实现笔记)

    说到redis的Dict(字典),虽说算法上跟市面上一般的Dict实现没有什么区别,但是redis的Dict有2个特殊的地方那就是它的rehash(重新散列)和它的字典节点单向链表. 以下是dict用 ...

  4. python list dict 去重的两种方式

    def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...

  5. list,tuple,dict,set常用方法

    Python中list,tuple,dict,set常用方法 collections模块提供的其它有用扩展类型 from collections import Counter from collect ...

  6. python dict clear只能删除一层,不能够递归删除。

    void PyDict_Clear(PyObject *op) { dictobject *mp; dictentry *ep, *table; int table_is_malloced; Py_s ...

  7. Python中内置数据类型list,tuple,dict,set的区别和用法

    Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...

  8. python第一天 - dict

    dict key-value集合. d = { ': 'a', ': 'b', ': 'c' } (一).获取集合长度:len(d) = 3(二).获取值: 方式一:d[key];例:d['1'] = ...

  9. python利用dict模拟switch

    pytho本身并未提供switch语句,但可以通过dict来模拟switch, #方法1 def add(x,y): return x+y def dec(x,y): return x-y def m ...

  10. python-list tuple dict set

    1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...

随机推荐

  1. ansible(9)--ansible的yum模块

    1. yum模块 功能:管理软件包,需要确认被管理端为红帽系列的,并且需要被管理端配置好yum源. 主要的参数如下: 参数 说明 name 指定安装软件包名或软件包URL state 指定yum对应的 ...

  2. 开发环境需要同时安装2个nodejs版本

    由于同时有vue2和vue3的项目开发情况,vue2项目的nodejs版本是12,vue3项目在node12版本下运行不了,要求最低14版本,因此要用nvm同时安装和控制2个版本. 安装步骤: 1.卸 ...

  3. ContextCapture-硬件配置推荐

    ContextCapture倾斜摄影的空三计算.三维建模应用.非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间. 硬件常见问题 随着倾斜摄影建模算法成熟,应用越来越广泛,数据量越来越大,需 ...

  4. Java 工程文件的 .gitignore

    以下是一个排查 Java 工程文件的 .gitignore 文件示例: # Java 编译器生成的文件 *.class # Maven 生成的文件夹 target/ # Eclipse 生成的文件夹 ...

  5. C 语言编程 — 异常处理

    目录 文章目录 目录 前文列表 异常处理 perror() 和 strerror() 输出异常信息 程序退出状态 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基 ...

  6. 【漏洞复现】用友NC uapjs RCE漏洞(CNVD-C-2023-76801)

    产品介绍 用友NC是一款企业级ERP软件.作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计.采购管理.销售管理.物料管理.生产计划和人力资源管理等,帮助企业实现数字化转型和高效管 ...

  7. 14个Flink SQL性能优化实践分享

    本文分享自华为云社区<Flink SQL性能优化实践> ,作者:超梦. 在大数据处理领域,Apache Flink以其流处理和批处理一体化的能力,成为许多企业的首选.然而,随着数据量的增长 ...

  8. 基于 OAuth2.0 协议的单点登录系统方案设计

    一.什么是单点登录? 单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一.SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...

  9. ChatGPT还是有点东西的-public static <T> List<T> Arrays.asList(T... a) {...}

    背景 业务开发需要判断业务状态是否在30.40.50.60的集合内,所以写了以下代码 int[] inLiq = {30,40,50,60}; return Arrays.asList(inLiq). ...

  10. linux开机出现initramfs无法进入系统

    linux开机出现initramfs无法进入系统 开机后进入initramfs模式,无法进入系统时不要慌: 想一想自己根分区的文件系统名是什么,有的人的是/dev/sda1,有的人的是/dev/sda ...