Как работает проверка равенства вложенных именованных кортежей? - PullRequest
0 голосов
/ 03 марта 2020
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

Проверка на равенство именованных кортежей для простых проверок именованных кортежей (то есть - не вложенных) на соответствие значений. Ключ игнорируется.

Как работает проверка равенства именованных кортежей для вложенных именованных кортежей?

1 Ответ

2 голосов
/ 03 марта 2020

Функция collections.namedtuple создает подтип tuple. В документах ничего не говорится о именованных кортежах, имеющих разные проверки на равенство с обычными кортежами, а source показывает, что тип namedtuple не переопределяет __eq__.

Итак, равенство именованных кортежей проверяется точно так же, как равенство регулярных кортежей: они должны иметь одинаковые значения в одинаковом порядке. «То же» проверяется равенством значений; поскольку обычные кортежи не имеют именованных атрибутов для своих значений или отдельных имен типов, метод 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
...