从 Dict 转到 Dataclass
从 dataclass 转到 dict 可以用 asdict 函数 , 反向转换的时候 就比较困难. 不用外部的包的情况下, 提供一种思路.
def mask(v, d): #v 是 dict 数据, d 是 @dataclass 类型
if isinstance(v, d):
pass
elif isinstance(v, Dict):
x = [v.get(k, None) for k in [i for i in d.__dict__['__annotations__']]]
y = list(d.__init__.__defaults__)
if len(y) > 0:
n = len(x)
m = len(y)
for i in range(m):
if x[n-m+i] is None:
x[n-m+i] = y[i]
x = tuple(x)
v = d(*x)
else:
v = None
return v
以上是转换用的函数, 用于处理 输入参数为dict形式
from dataclasses import dataclass, asdict
from typing import Dict
def mask(v, d): #v 是 dict 数据, d 是 @dataclass 类型
if isinstance(v, d):
pass
elif isinstance(v, Dict):
x = [v.get(k, None) for k in [i for i in d.__dict__['__annotations__']]]
y = list(d.__init__.__defaults__)
if len(y) > 0:
n = len(x)
m = len(y)
for i in range(m):
if x[n-m+i] is None:
x[n-m+i] = y[i]
x = tuple(x)
v = d(*x)
else:
v = None
return v
@dataclass
class ddd:
a: str
c: str = ""
b: str = ""
@dataclass
class bbb:
a: str
b: ddd = None
c: str = ""
def __post_init__(self):
self.b=mask(self.b,ddd)
@dataclass
class aaa:
a: str
b: str
c: bbb = None
def __post_init__(self):
self.c=mask(self.c, bbb)
if __name__=="__main__":
x = aaa(1, 2, {'a': 4, 'b': {'a':6,'c':7}})
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的更多相关文章
- Python3.7 dataclass 介绍
Posted on 2018年6月28日 by laixintao 1 Comment Python3.7 加入了一个新的 module:dataclasses.可以简单的理解成“支持默认值.可以修改 ...
- tuple放入dict中
tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...
- redis数据结构存储Dict设计细节(redis的设计与实现笔记)
说到redis的Dict(字典),虽说算法上跟市面上一般的Dict实现没有什么区别,但是redis的Dict有2个特殊的地方那就是它的rehash(重新散列)和它的字典节点单向链表. 以下是dict用 ...
- python list dict 去重的两种方式
def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...
- list,tuple,dict,set常用方法
Python中list,tuple,dict,set常用方法 collections模块提供的其它有用扩展类型 from collections import Counter from collect ...
- python dict clear只能删除一层,不能够递归删除。
void PyDict_Clear(PyObject *op) { dictobject *mp; dictentry *ep, *table; int table_is_malloced; Py_s ...
- Python中内置数据类型list,tuple,dict,set的区别和用法
Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...
- python第一天 - dict
dict key-value集合. d = { ': 'a', ': 'b', ': 'c' } (一).获取集合长度:len(d) = 3(二).获取值: 方式一:d[key];例:d['1'] = ...
- python利用dict模拟switch
pytho本身并未提供switch语句,但可以通过dict来模拟switch, #方法1 def add(x,y): return x+y def dec(x,y): return x-y def m ...
- python-list tuple dict set
1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...
随机推荐
- ansible(9)--ansible的yum模块
1. yum模块 功能:管理软件包,需要确认被管理端为红帽系列的,并且需要被管理端配置好yum源. 主要的参数如下: 参数 说明 name 指定安装软件包名或软件包URL state 指定yum对应的 ...
- 开发环境需要同时安装2个nodejs版本
由于同时有vue2和vue3的项目开发情况,vue2项目的nodejs版本是12,vue3项目在node12版本下运行不了,要求最低14版本,因此要用nvm同时安装和控制2个版本. 安装步骤: 1.卸 ...
- ContextCapture-硬件配置推荐
ContextCapture倾斜摄影的空三计算.三维建模应用.非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间. 硬件常见问题 随着倾斜摄影建模算法成熟,应用越来越广泛,数据量越来越大,需 ...
- Java 工程文件的 .gitignore
以下是一个排查 Java 工程文件的 .gitignore 文件示例: # Java 编译器生成的文件 *.class # Maven 生成的文件夹 target/ # Eclipse 生成的文件夹 ...
- C 语言编程 — 异常处理
目录 文章目录 目录 前文列表 异常处理 perror() 和 strerror() 输出异常信息 程序退出状态 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基 ...
- 【漏洞复现】用友NC uapjs RCE漏洞(CNVD-C-2023-76801)
产品介绍 用友NC是一款企业级ERP软件.作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计.采购管理.销售管理.物料管理.生产计划和人力资源管理等,帮助企业实现数字化转型和高效管 ...
- 14个Flink SQL性能优化实践分享
本文分享自华为云社区<Flink SQL性能优化实践> ,作者:超梦. 在大数据处理领域,Apache Flink以其流处理和批处理一体化的能力,成为许多企业的首选.然而,随着数据量的增长 ...
- 基于 OAuth2.0 协议的单点登录系统方案设计
一.什么是单点登录? 单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一.SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...
- ChatGPT还是有点东西的-public static <T> List<T> Arrays.asList(T... a) {...}
背景 业务开发需要判断业务状态是否在30.40.50.60的集合内,所以写了以下代码 int[] inLiq = {30,40,50,60}; return Arrays.asList(inLiq). ...
- linux开机出现initramfs无法进入系统
linux开机出现initramfs无法进入系统 开机后进入initramfs模式,无法进入系统时不要慌: 想一想自己根分区的文件系统名是什么,有的人的是/dev/sda1,有的人的是/dev/sda ...