从 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 ...
随机推荐
- Github Copilot绑定Jetbrains IDE无效的解决方案
在Github中进行教育认证后不会自动开通Copilot功能,因此,在进行了Github教育认证之后,在使用之前要进入Github Copilot官网开通Coplilot,如果忽略了这一点,绑定Jet ...
- 美团二面:SpringBoot读取配置优先级顺序是什么?
引言 Spring Boot作为一种轻量级的Java应用程序框架,以其开箱即用.快速搭建新项目的特性赢得了广大开发者的青睐.其核心理念之一就是简化配置过程,使开发者能够快速响应复杂多变的生产环境需求. ...
- ansible(7)--ansible的file模块
1. file模块 功能:为被控端创建文件或目录,设定权限属性: 主要参数如下: 参数 说明 path 指定远程服务器的路径,也可以写成'dest','name' state 状态,可以将值设定为di ...
- vue 安装教程(如何在node环境下搭建vue项目)
如果要配置node.js环境请查看(node.js环境在Window和Mac中配置,以及安装cnpm和配置Less环境)在终端输入命令 cnpm -v出现版本号 1.安装vue window : ...
- JavaScript中对数组.map()、some()、every()、filter()、forEach的区别
1.区别说明 共同点: 不会对原数组发生修改,而是返回新的变量,用变量接收. 不同点: 1.some():返回一个Boolean类型变量,判断是否有元素符合func条件 2.every():返回一个B ...
- blocks (单调栈)
题目描述 解析 对于这道题,他要求大于k的数进行操作,所以直接让每个数减k,然后用前缀和维护一下与0比较就可以了,因为一段区间和的平 均值大于k的话,那么这就是一个合法区间,即为操作后的这个区间和大于 ...
- .NET 中的表达式树
.NET 中的表达式树(Expression Trees) 表达式树是什么? 表达式树(Expression Trees)是.NET框架中的一个强大功能,它将代码表示为一个由表达式节点组成的树形结构. ...
- Instsrv.exe 与 Srvany.exe 安装Windows服务
原理:Instsrv.exe可以给系统安装和删除服务 Srvany.exe可以让exe程序以服务的方式运行(Srvany只是exe注册程序的服务外壳,可以通过它让我们的程序以SYSTEM账户活动,随电 ...
- 企业生产环境中的麒麟V10(ARM架构)操作系统部署jdk和redis三主三从交叉版集群
前言:麒麟ARM操作系统是国企和政务机关推行信创化选择率比较高的一款操作系统,然而ARM操作系统非主流的X86系统,除了命令一样,在架构方面差别极大,初次接触多多少少会踩坑,下面我将在公司中部署的实例 ...
- Vue cli之创建组件
一般在开发中,我们会人为把组件分2个目录存放,一个代表的页面组件,另一个代表页面一部分的子组件. src/ |- views/ |- Home.vue |- components/ |- App.vu ...