Python 3.7:dataclass不会为`eq = False`引发`TypeError`

xss*_*han 25 python python-3.7 python-dataclasses

dataclasses在Python 3.7中尝试新的

dataclass装饰可以传递的参数来控制被添加到类dunder功能.

出于某种原因,装饰似乎并没有提高TypeErroreq=False说法.

根据文档:

eq: If true (the default), an __eq__ method will be generated. 
This method compares the class as if it were a tuple of its fields, in order. 
Both instances in the comparison must be of the identical type
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,如果我通过eq = False,__eq__则不会添加函数,并且TypeError在比较同一类的两个实例时应抛出a .相反,该eq参数似乎没有任何效果.

@dataclass(eq = False)
class Number:
    val: int

a = Number(1)
b = Number(2)
c = Number(1)

a == b
False

a == c
False
Run Code Online (Sandbox Code Playgroud)

以上不会提高TypeError并始终评估为False.

@dataclass()
class Number:
    val: int

a = Number(1)
b = Number(2)
c = Number(1)

a
Number(val = 1)

a == b
False

a == c
True
Run Code Online (Sandbox Code Playgroud)

其他参数(例如:order,repr)似乎表现得如预期的那样

@dataclass(order = False, repr = False)
class Number:
    val:int

a = Number(1)
b = Number(2)
c = Number(1)

a
<__main__.Number object at 0x7fe1036c8b38>

a < b
Traceback (most recent call last):                                                                                                          
  File "<stdin>", line 1, in <module>                                                                                                       
TypeError: '<' not supported between instances of 'Number' and 'Number' 
Run Code Online (Sandbox Code Playgroud)

我的理解是否存在一些差距?

我正在使用码头图像 python/rc-stretch

Arn*_*rne 28

在python3.7中,给出了以下数据类定义

@dataclass(eq=False)
class Number:
    val: int
Run Code Online (Sandbox Code Playgroud)

预期的结果Number(1) == Number(1)False.这是正确的,因为设置eq = True只覆盖默认的python-object相等函数,is在这种情况下它只检查相同的引用(相同).


数据类规范是有点欠缺这里.它解释了eq参数

eq:如果为true(默认值),将生成__eq__方法.此方法按顺序将类比较为其字段的元组.[...]

但是为了理解你遇到的问题,你还需要知道基本的python对象已经提供了一个__eq__函数:

>>> class A: pass
...
>>> dir(A())
['__class__', '__delattr__', ... '__eq__', ...]  # has __eq__ already
Run Code Online (Sandbox Code Playgroud)


ger*_*rit 6

当你没有定义时__eq__,__eq__将解决object.__eq__.这就是用你创建数据类时发生的事情eq=False.

object.__eq__(self, other)除非self is other,除非两者是同一个对象,否则为False .