嵌套命名元组相等性检查如何工作?
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
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