首页 > 编程语言 >python dataclasses定义默认值为可变类型(转)

python dataclasses定义默认值为可变类型(转)

时间:2023-04-20 13:22:21浏览次数:42  
标签:dataclasses python self list element add dataclass 默认值 class

原文:https://zhuanlan.zhihu.com/p/59658886

作者:没有50CM手臂

网站:知乎

 

场景还原

最近开发遇到一个问题是在python3.7dataclass中不能使用可变的默认值,错误如下:

@dataclass
class Foo:
    bar: list = []

# ValueError: mutable default <class 'list'> for field a is not allowed: use default_factory

收到这种错误之后,修改为如下即可:

from dataclasses import (
  dataclass,
  field
)
@dataclass
class Foo:
    bar: list = field(default_factory=list)

深层解读

看起来我的问题在文档中得到了很清楚的回答(来自PEP 557,正如shmee所提到的):
Python在类属性中存储默认成员变量值。考虑这个例子,不使用数据类:

class C:
    x = []
    def add(self, element):
        self.x.append(element)

o1 = C()
o2 = C()
o1.add(1)
o2.add(2)
assert o1.x == [1, 2]
assert o1.x is o2.x

请注意,类的两个实例按预期C共享相同的类变量x。

使用数据类,如果此代码有效:

@dataclass
class D:
    x: List = []
    def add(self, element):
        self.x += element

它会生成类似于的代码:

class D:
    x = []
    def __init__(self, x=x):
        self.x = x
    def add(self, element):
        self.x += element'

这与使用类的原始示例具有相同的问题C。也就是说,在创建类实例时D没有指定值x的两个类实例将共享相同的副本x。由于数据类只使用普通的Python类创建,因此它们也会共享此行为。数据类没有通用的方法来检测这种情况。相反,数据类将抛出一个TypeError,如果它检测类型的默认参数list,dict或set。这是一个部分解决方案,但它可以防止许多常见错误。

标签:dataclasses,python,self,list,element,add,dataclass,默认值,class
From: https://www.cnblogs.com/ajianbeyourself/p/17336447.html

相关文章

  • python a股量化解决方案
    baostockhttp://baostock.com/baostock/index.php/A股K线数据pytdxhttps://rainx.gitbooks.io/pytdx/content/pytdx_reader.html......
  • LeetCode Top100: 相交链表(Python)
    LeetCodeTop100:相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原......
  • 【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介备忘录模式(MementoPattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。备忘录模式的角色有三个......
  • LeetCode Top100: 环形链表(python)
     给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为......
  • Python 图像处理实用指南:11~12
    原文:Hands-OnImageProcessingwithPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。十一、深入学习图像处理——......
  • 理解 Python 的 Dataclasses第二篇(转)
    原文:https://zhuanlan.zhihu.com/p/59658598作者:没有50CM手臂网站:知乎这是Python最新的Dataclasses系列的第二部分内容。在第一部分里,我介绍了dataclasses的一般用法。这篇博客主要介绍另一个特征:dataclasses.field。我们已经知道Dataclasses会生成他们自身的__init__方法。......
  • 理解 Python 的 Dataclasses第一篇(转)
    原文:https://zhuanlan.zhihu.com/p/59657729作者:没有50CM手臂网站:知乎引言Dataclasses是一些适合于存储数据对象(dataobject)的Python类。你可能会问,什么是数据对象?下面是一个并不详尽的用于定义数据对象的特征列表:他们存储并表示特定的数据类型。例如:一个数字。对于那些熟悉......
  • python+playwright 学习-54 结合 gremlins.js 实现web 网页的mokey测试
    前言在Android应用测试里面有个mokey测试可以对app做稳定性的测试,在app里面随机乱点发送一些事件,看app会不会异常。这种做法,也称为Monkey测试或Fuzz测试,在移动应用程序开发中非常常见。Gremlins.js模拟随机用户操作:gremlins单击窗口中的任意位置,在表格中输入随机数......
  • PYTHON TXT 去空行
    withopen('file.txt','r')asf:lines=f.readlines()withopen('file.txt','w')asf:forlineinlines:ifline.strip():f.write(line)首先,我们使用`open()`函数打开文件,并使用`readlines()`方法读取文件中的所有......
  • python pyautogui检测鼠标点击事件
    目录pythonpyautogui检测鼠标点击事件pythonpyautogui检测鼠标点击事件在Python中,可以使用pyautogui模块来检测鼠标的点击事件,并判断左键或右键。下面是一个示例代码,可以检测鼠标的点击事件,并根据左键或右键输出不同的信息:pythonCopyimportpyautoguiwhileTrue:tr......