Python dataclass 期望可以为None

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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值