Когда представления dict_values ​​могут быть похожими на набор (и почему)? - PullRequest
6 голосов
/ 01 мая 2019

В документах сказано, что представления значений не рассматриваются как набор-подобные , но иногда они таковы:

>>> d = {1: 1}
>>> d.values() | d.keys() 
{1}
>>> d.values() & d.keys() 
{1}
>>> d.values() - d.keys() 
set()

Зачем реализовывать семантику наборов, возвращающих наборы, но затем отказывать с набором фактический ?

>>> d.values() - {1}
TypeError: unsupported operand type(s) for -: 'dict_values' and 'set'

1 Ответ

8 голосов
/ 01 мая 2019

Это на самом деле не dict_values обработка операции (й).keys_view будет усиливать операцию с правой стороны, поддерживая отраженный метод (ы):

>>> set().__rsub__({}.values())
NotImplemented
>>> {}.keys().__rsub__({}.values())
set()

По аналогичным причинам операции над множествами иногда будут работать или не работать с другими представлениями dict:

# works, because type(d.items()) implements __rsub__
>>> d.values() - d.items()  
{1}

# fails, because type(d.values()) does not implement __rsub__
>>> d.values() - d.values()
TypeError: unsupported operand type(s) for -: 'dict_values' and 'dict_values'

Итак, хотя такое поведение нарушает типизацию утки, документы остаются правильными.

...