从 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=''))
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号