В документах написано, что Представления значений не рассматриваются как наборы, но иногда это:
>>> 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'






На самом деле это не dict_values обработка операций. keys_view усилит операцию с правой стороны, поддерживая отраженные методы:
>>> set().__rsub__({}.values())
NotImplemented
>>> {}.keys().__rsub__({}.values())
set()
По тем же причинам операции 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'
Таким образом, хотя такое поведение кажется нарушением утиного набора, документы остаются правильными.