Согласно PEP 468:
Начиная с версии 3.6 Python сохранит порядок аргументов ключевого слова, переданный функции. Для этого собранные kwargs теперь будут упорядоченным отображением. Обратите внимание, что это не обязательно означает
OrderedDict
.
В этом случае, почему это упорядоченное сопоставление не учитывает сравнение равенства с каноническим упорядоченным типом отображения Python, collections.OrderedDict
:
>>> from collections import OrderedDict
>>> data = OrderedDict(zip('xy', 'xy'))
>>> def foo(**kwargs):
... return kwargs == data
...
>>> foo(x='x', y='y') # expected result: True
True
>>> foo(y='y', x='x') # expected result: False
True
Хотя порядок итерации теперь сохраняется, kwargs
, похоже, ведет себя так же, как обычный dict для сравнений. Python имеет C реализованный упорядоченный dict начиная с 3.5, поэтому он, возможно, мог быть использован напрямую (или, если производительность по-прежнему вызывает беспокойство, быстрее реализация с использованием тонкого подкласса 3.6 compact dict).
Почему упорядоченное сопоставление, полученное функцией, не упорядочивается при сравнении сравнений?