首页 > 编程语言 >Python dataclass 如何让传入的 field 为 None 时自动转化为默认值?

Python dataclass 如何让传入的 field 为 None 时自动转化为默认值?

时间:2023-09-25 11:23:03浏览次数:42  
标签:__ None Python field str dataclass 默认值

一般 dataclass 的字段可以设置 default 或 default_factory 生成默认值,当传入参数时,默认值不会生效。但是,有些情况下受限于外部调用环境,某些参数缺失时,以 None 的形式存在,而非创建 dataclass 实例时不传入参数。这种情况下,可能会希望传入的 None 被识别到并转化为默认值。

from dataclasses import dataclass, field
@dataclass
class Specs:
    a: str
    b: str = field(default='Bravo')
    c: str = field(default='Charlie')

print(Specs(1)) # Specs(a=1, b='Bravo', c='Charlie')
print(Specs(1, None, None)) # Specs(a=1, b=None, c=None)

参考资料:

__post__init__

可以考虑在 __post__init__ 方法中对 None 进行处理,但是存在代码冗余的缺陷,即会重复默认值的生成代码(在属性声明时 field(default=xxx) 已经声明了默认值),如果只在 __post__init__ 中生成默认值,如下面代码所示,就会丢失掉默认值的类型提示。

@dataclass
class Specs2:
    a: str
    b: str
    c: str

    def __post_init__(self):
        if self.b is None:
            self.b = 'Bravo'
        if self.c is None:
            self.c = 'Charlie'

使用类名访问类属性(默认值)

下面的方法看起来简洁很多,但是适用条件也比较有限,即默认值需要是直接指定的,而非使用 field 指定。

@dataclass
class Specs1:
    a: str
    b: str = 'Bravo'
    c: str = 'Charlie'
a = 'Apple'
b = None
c = 'Potato'
specs = Specs1(a=a, b=b or Specs1.b, c=c or Specs1.c)
>>> specs
Specs1(a='Apple', b='Bravo', c='Potato')

我的方法

这是我最后选择的方法,给 dataclass 添加一个 from_dict 的方法,好处是,可以对于实例化时传入参数的合法性进行检验,调用端只需要提供字典类型的输入即可。


from dataclasses import dataclass, field

@dataclass
class Specs:
    a: str
    b: str = 'Bravo'
    c: str = 'Charlie'
    
    @staticmethod
    def from_dict(data: dict):
        data = {
            k: v for k, v in data.items()
            if k in ['a', 'b', 'c'] and v is not None
        }
        return Specs(**data)

# 通过某种方式获得以下参数
a = 'Apple'
b = None
c = 'Potato'
Specs.from_dict({'a': a, 'b': b, 'c': c})

标签:__,None,Python,field,str,dataclass,默认值
From: https://www.cnblogs.com/zkmjolnir/p/17727413.html

相关文章

  • 【Python】Main函数的使用方法
    Start在Python中,类(Class)本身没有main函数。但是,您可以在类中定义一个方法(例如main),然后在类的实例中调用该方法。在Python中,通常使用if__name__=="__main__":来检查当前模块是否作为主程序运行。如果是,则执行相应的代码。下面是一个简单的示例,说明如何在Python类中定义一个mai......
  • python基础 循环嵌套
    嵌套语句使用星号打印foriinrange(1,6):forxinrange(1,i+1):print('*',end='')print('')foriinrange(1,6):forxinrange(i,6):print('*',end='')print('')99乘法表  while......
  • python的配置文件 ini 类型/json类型
    ini类型会把所有的value都改成str类型,而json会保持原本value的类型不变。1.ini/cnf等类型配置文件cfg.cfg[mysql]host="10.12.7.154"port=31066user="root"password="xxx"charset="utf8"database="project_database"使用配置文件from......
  • python去除某列固定数字对应的整行方法
     想去除month列里的1,2,3,4,10,11,12月对应的行留下5,6,7,8,9月#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Su@file:deletestaion.py@time:2023/09/22@desc:"""importpandasaspddf=pd.read_excel('/lianxi/SPI.xlsx�......
  • 用python脚本计算某一个文件的行数
    python可以统计文件的行数,你相信吗?不管你信不信反正我信了。下面我们来看一下python怎样统计文件的行数,代码很简单,我也做了注释,很简单的实现。。。123456789101112131415161718192021#_*_coding:utf_8#引入sys和系统os模块import sys import os '''计算某一个文件的行数'''def......
  • (转)Python描述数据结构之线索二叉树篇
    原文:https://blog.csdn.net/qq_42730750/article/details/108285846前言  本篇章主要介绍线索二叉树,包括线索二叉树的基本概念、构造及遍历,并用Python实现其创建及其遍历等操作。1.基本概念  上篇博客介绍的二叉链表的存储结构体现的只是一种父子关系,它不能直接得到结点在......
  • python面向对象的三大特性:封装性、继承性、多态性
    python面向对象的三大特性:封装性、继承性、多态性一、python中的封装在python代码中,封装具有两层含义:①在把现实世界中的实体中的属性和方法写到类的里面的操作即为封装。classPerson(object):#封装属性#封装方法②封装可以为属性和方法添加私有权限(属性和方......
  • Python 基本语法
    在开始学习Python编程语言之前,首先要掌握基本的语法。本文将介绍Python编程语言的基本语法,帮助初学者顺利进入Python编程世界。一、Python编程语言概述Python是一种高级编程语言,具有简单易学、语法简洁、功能强大等特点。Python支持多种编程范式,包括面向对象、面向......
  • 如何在python代码中自动插入时间和作者信息
    在编程的过程中,为养成良好的写代码习惯,很多人通常喜欢将一些作者信息以及编码信息存储在代码中,以便于后期的查阅,也可帮助后来者进行快速入手,那么如何才能让他自动出现在我们的代码中呢,我们可按照下面的方式进行设置,希望可以帮到你!在python编程工具pycharm中按照以下路径打开:File......
  • 小白学Python:提取Word中的所有图片,只需要1行代码
    大家好,这里是程序员晚枫,全网同名。最近在小破站账号:Python自动化办公社区更新一套课程:给小白的《50讲Python自动化办公》在课程群里,看到学员自己开发了一个功能:从word里提取图片。这个功能非常实用。我在征求开发者:王鹏大哥的同意后,把这行代码集成到了python-office这个库里,实现......