当前位置: 首页 > web >正文

python中的 @dataclass

今天写日志模块时,需求需要将常见的.log格式转为.jsonl格式。由于是封装的标准库logging的东西,原来是简单的字符串formatter格式,现在要转为json格式,同时要传入不同字段并以特定顺序进行打印。

转json-formatter容易,只需要封装logging.Formatter类即可。但是将配置以特定字段顺序打印却很繁琐,要么需要实现类,要么以Dict+大量硬编码实现,同时也伴随着需求的不断变化。最后找到了@dataclassasdict方法进行处理,极大的简化了开发效率。

@dataclass是Python3.7引入的标准库功能,位于模块dataclasses中,是用来简化数据类定义的装饰器。

传统上,定义一个只用来存储数据的类时,需要手动实现__init____repr____eq__等方法。而使用@dataclass能自动生成这些方法。

传统上:

class Person:def __init__(self, name, age):self.name = nameself.age = age

使用@dataclass

@dataclass
class Person:name: strage: int
# 等价于
class Person:def __init__(self, name: str, age: int):self.name = nameself.age = agedef __repr__(self):return f'Person(name={self.name!r}, age={self.age!r})'def __eq__(self, other):return isinstance(other, Person) and self.name == other.name and self.age == other.age

@dataclass的一些参数:

  • init=True:是否自动生成 __init__(默认是)
  • repr=True:是否自动生成 __repr__(默认是)
  • eq=True:是否自动生成 __eq__(默认是)
  • order=True:是否添加比较运算符,如 <>=(需字段支持)
  • frozen=True:是否生成“不可变类”(类似 namedtuple
  • slots=True:是否使用 __slots__ 限定字段。

同时也带默认值和字段控制

@dataclass
class Config:host: strport: int = 8080debug: bool = field(default=False)

@dataclass装饰器要求必须字段必须在可选字段的前面

@dataclass
class LogEntry:# 必选a: strb: strc: str# 可选d: Optional[str] = Nonee: Dict[str, Any] = field(default_factory=dict)

赋值完数据后,使用asdict将其转换为Dict

from dataclasses import asdict, dataclass, field
from typing import Dict, Any, Optional
@dataclass
class LogEntry:# 必选a: strb: strc: str# 可选d: Optional[str] = Nonee: Dict[str, Any] = field(default_factory=dict)
logentry = LogEntry(a='a',b='b',c='c',
)
logentry_dict = asdict(logentry)
print(logentry_dict)

在赋值时,由于存在可选字段没有进行赋值,还是默认值,如果想要去掉默认的可选字段可以使用字典变量:

filtered_log_data = {k: v for k, v in logentry_dict.items() if (v is not None and v != {})}

完整:

from dataclasses import asdict, dataclass, field
from typing import Dict, Any, Optional
@dataclass
class LogEntry:# 必选a: strb: strc: str# 可选d: Optional[str] = Nonee: Dict[str, Any] = field(default_factory=dict)
logentry = LogEntry(a='a',b='b',c='c',
)
logentry_dict = asdict(logentry)
filtered_log_data = {k: v for k, v in logentry_dict.items() if (v is not None and v != {})}
print(filtered_log_data)
http://www.xdnf.cn/news/16727.html

相关文章:

  • 第4章唯一ID生成器——4.5 美团点评开源方案Leaf
  • 【22】C# 窗体应用WinForm ——定时器Timer属性、方法、实例应用,定时切换画面
  • 破解企业无公网 IP 难题:可行路径与实现方法?
  • 【MySQL基础篇】:MySQL表的约束常用类型以及实战示例
  • 【C#获取高精度时间】
  • Prometheus + Grafana + Micrometer 监控方案详解
  • JVM指令集
  • 重生之我在暑假学习微服务第四天《Docker-下篇》
  • 【学习路线】游戏开发大师之路:从编程基础到独立游戏制作
  • uniapp开发微信小程序(新旧版本对比:授权手机号登录、授权头像和昵称)
  • Python与Spark
  • 【深度学习】独热编码(One-Hot Encoding)
  • C++_红黑树树
  • CMake 完全实战指南:从入门到精通
  • 使用redis 作为消息队列时, 如何保证消息的可靠性
  • Leetcode 08 java
  • 鸿蒙Harmony-自定义List组件,解决List组件手势滑动点击卡住问题
  • Apache Ignite 的分布式队列(IgniteQueue)和分布式集合(IgniteSet)的介绍
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 0基礎網站開發技術教學(一) --(前端篇)--
  • 《Java 程序设计》第 9 章 - 内部类、枚举和注解
  • Java07--面向对象
  • 自动调优 vLLM 服务器参数(实战指南)
  • 如何用USRP捕获手机信号波形(下)协议分析
  • 怎么理解使用MQ解决分布式事务 -- 以kafka为例
  • 小白学OpenCV系列1-图像处理基本操作
  • 机器学习-十大算法之一线性回归算法
  • gTest测试框架的安装与配置
  • Qt 并行计算框架与应用
  • 项目优化中对象的隐式共享