from dataclasses import dataclass, field, make_dataclass, MISSING
from typing import List, Dict, Union, Tuple
class DataClassMixin:
@classmethod
def from_dict(cls, data: dict) -> 'DataClassMixin':
return make_part_dataclass(cls, **data)
@classmethod
def from_kwargs(cls, **kwargs) -> 'DataClassMixin':
return make_part_dataclass(cls, **kwargs)
@dataclass
class MemberInfo(DataClassMixin):
"""会员信息"""
card_no: str # 会员卡号
credit: str # 会员积分
@dataclass
class UserInfo(DataClassMixin):
name: str # 用户名
member_info: MemberInfo = None # 会员信息
age: int = 18 # 年龄
def make_part_dataclass(super_cls, **kwargs):
"""创建数据类 没有赋值的字段默认为None"""
if not hasattr(super_cls, '__dataclass_fields__'):
raise ValueError(f'{super_cls} is not a dataclass')
part_cls_name = super_cls.__name__ + 'Part' # 新的子类名称
field_name_list, part_cls_fields = [], []
for field_name, field_ in super_cls.__dataclass_fields__.items():
field_name_list.append(field_name)
field_default = None
if field_.default != MISSING: # 如果设置了默认值,使用默认值
field_default = field_.default
part_cls_fields.append((field_name, field_.type, field(default=field_default)))
part_cls = make_dataclass(part_cls_name, part_cls_fields, bases=(super_cls,))
# 删除kwargs中没有的字段
new_kwargs = {key: kwargs[key] for key in kwargs if key in field_name_list}
return part_cls(**new_kwargs)
Python dataclass 期望可以为None
最新推荐文章于 2024-06-24 10:05:24 发布