Почему операторы набора работают с объектами представления dict_key, но не с эквивалентными методами набора?

Редактировать: возможный дубликат. Только после публикации этого вопроса и просмотра «связанных вопросов» я смог найти Почему методы set, такие как .intersection(), не поддерживаются для объектов, подобных set?, этот вопрос может достаточно похоже, чтобы быть дубликатом.

Я пытаюсь увидеть, являются ли ключи из словаря подмножеством набора, и столкнулся с некоторым запутанным поведением объекта представления dict_keys и методов/операторов набора.

Разница между набором и представлением указывает на то, что:

Только представление словаря dict.keys() всегда является набором (поскольку он ведет себя как набор, но с живым представлением словаря)

И https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects указывает, что

Представления ключей похожи на наборы, поскольку их записи уникальны и могут хэшироваться. ... Для представлений, подобных наборам, доступны все операции, определенные для абстрактного базового класса collections.abc.Set (например, ==, ‹ или ^).

и https://docs.python.org/2/library/stdtypes.html#set подразумевает, что операторы (‹=, |, и т. д.) эквивалентны методам .issubset(), union() и т. д.

Однако следующий код не отражает эти утверждения:

> dic = {'first': 'a', 'second': 'b'}

> s = {'first', 'second', 'third'}

> dic.keys() <= s

True

> dic.keys().issubset(s)


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-354-fbf8f9744a80> in <module>
----> 1 dic.keys().issubset(s)

AttributeError: 'dict_keys' object has no attribute 'issubset'

Однако s.issuperset(dic.keys()) возвращает True.

Почему наблюдается различное поведение, когда все указывает на то, что метод .issubset() будет работать?


person johnDanger    schedule 25.07.2019    source источник
comment
Голосование по закрытию как в первую очередь основанное на мнении. С таким же успехом можно спросить, почему set поддерживает issubset, когда <= уже делает то же самое.   -  person chepner    schedule 25.07.2019


Ответы (1)


В качестве ответа на Почему методы множества, такие как .intersection(), не поддерживаются для объектов, подобных множеству? указывает,

dict только гарантируют, что API collections.abc.Set не будет эквивалентен самому набору (...) эти объекты, подобные набору, не претендуют на соответствие набору или даже замороженному набору, просто collections.abc.Set (и) collections.abc.Set не требует ни одного из названных методов, кроме isdisjoint (который не имеет эквивалента оператора).

person johnDanger    schedule 25.07.2019