Функция 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