Почему словари (dict_items) поддерживают объединение (__or__), а не дополнение (__add__)?

1

Пример для иллюстрации:

>>> a = dict(eggs='eggs', spam='spam')
>>> b = dict(spam='spam', ham='ham')
>>> dict(a.items() | b.items())
{'eggs': 'eggs', 'ham': 'ham', 'spam': 'spam'}

В то же время...

>>> dict(a.items() + b.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'

Для этого есть причина? Не было бы разумным предположить, что дополнение и союз должны делать то же самое для словарей?

В Python 2 это отлично работает:

>>> dict(a.items() + b.items())
{'eggs': 'eggs', 'ham': 'ham', 'spam': 'spam'}

Хотя в Python 2 .items() возвращает обычный список (в отличие от dict_items), возможно, это случайно.


Наконец, я не думаю, "что произойдет, если ключи имеют разные значения" -dilemma применяется здесь как оператор | похоже, не имеет никакого значения (одно из двух значений выбрано, по-видимому, случайным образом).

  • 0
    Кстати, я только спрашиваю, почему это не поддерживается (или есть какая-либо причина). У меня нет конкретного варианта использования, который я пытаюсь решить - мне просто любопытно.
Теги:
python-3.x

3 ответа

3

Некоторые виды dictчастности, not dict.values) поддерживают операции набора. + не является заданной операцией, поэтому нет реальной причины, по которой она должна быть включена.

  • 0
    Да, это не так! - поддерживается. Вот почему это казалось противоречивым для меня.
  • 0
    Потому что set твою поддержку - как разницу . Они делают это, потому что это существующая математическая запись.
Показать ещё 1 комментарий
1

Вернемся к самой простой мантре Python: Zen of Python.

Должен быть one-- и желательно только один способ --obvious.

Поэтому вы спрашиваете, почему + не следует определять, чтобы сделать то же самое, что | , Ваш ответ прямо там: было бы два одинаково правильных способа сделать то же самое, что не было бы Pythonic.

1

Просто чтобы добавить бит в ответ dict_items объект dict_items является подклассом collections.Set dict_items

from collections.abc import Set

isinstance(d.items(), Set) # True

и Set не имеет операции +:

'__add__' in dir(Set) # False

Ещё вопросы

Сообщество Overcoder
Наверх
Меню