嵌套命名元组相等性检查如何工作?

How does nested named tuple equality check work?

import typing
from enum import Enum


class Group(typing.NamedTuple):
    group_id: int
    group_name: str    


class Groups(Enum):
    A = Group(1, 'Group A')
    B = Group(2, 'Group B')


class Member(typing.NamedTuple):
    member_id: int
    member_name: str
    member_group: Group


class Members(Enum):
    member1 = Member(1, 'Merber 1', Groups.A.value)
    member2 = Member(2, 'Merber 2', Groups.B.value)

print(Groups.A.value)
print(Groups.B.value)

print(Members.member1.value)
print(Members.member2.value)

print(Groups.A.value == Groups.B.value) # simple named tuple
print(Members.member1.value == Members.member2.value)   #nested named tuple

简单命名元组(即非嵌套)的命名元组相等性检查检查值匹配。密钥被忽略。

命名元组相等性检查如何用于嵌套命名元组?

collections.namedtuple function creates a subtype of tuple. The docs don't mention anything about namedtuples having different equality checks to regular tuples, and the source 表明命名元组类型不会覆盖 __eq__

因此,命名元组的相等性与常规元组的相等性的测试方式完全相同:它们必须以相同的顺序具有相同的值。 "Same" 通过值的相等性进行测试;由于常规元组的值没有命名属性,也没有不同的类型名称,因此 tuple.__eq__ 方法不会查看属性名称或类型名称。

一些演示:

>>> from collections import namedtuple
>>> A = namedtuple('A', 'x y')
>>> a = A(1, 2)
>>> a == (1, 2)
True # equal to a regular tuple
>>> B = namedtuple('B', 'z w')
>>> b = B(1, 2)
>>> a == b
True # equal to a different namedtuple type with different attribute names
>>> A([1, 2], [3, 4]) == B([1, 2], [3, 4])
True # equal when values are different by identity
>>> A(a, b)
A(x=A(x=1, y=2), y=B(z=1, w=2))
>>> B(b, a)
B(z=B(z=1, w=2), w=A(x=1, y=2))
>>> A(a, b) == B(b, a)
True # equal when values are equal namedtuples