Каковы различия между Set, FrozenSet, MutableSet и AbstractSet в модуле ввода python?

Я пытаюсь комментировать мой код, но я немного смущен, когда дело доходит до наборов. Я читал некоторые моменты в PEP 484:

Примечание: Dict, List, Set и FrozenSet в основном полезны для аннотирования возвращаемых значений. Для Аргументов предпочитайте абстрактные типы коллекций, определенные ниже, например Mapping, Sequence или AbstractSet .

и

Set, переименованный в AbstractSet . Это изменение имени было необходимо потому что Set в модуле ввода означает set () с дженериками.

но это не помогает.

мой первый вопрос: каковы общие черты и различия между Set, FrozenSet, MutableSet и AbstractSet?

мой второй вопрос: почему, если я попробую

from collections import FrozenSet

Я

ImportError: cannot import name 'FrozenSet'

?

Я использую Python 3.4, и я установил mypy-lang через pip.

4 ответов


будьте осторожны с аннотациями и печатать. Идеи, обсуждаемые в 484, являются совершенно новыми и реализованы в typing модуль. Этот модуль доступен только в Python3.5 (Последний typing также доступен из pip для Py2 и Py3).

https://docs.python.org/3/library/typing.html

это примечание, которое вы процитировали, из раздела в 484, который начинается:

чтобы открыть использование проверки статического типа на Python 3.5, а также более старые версии, требуется единое пространство имен. Для этого в стандартную библиотеку вводится новый модуль под названием typing .

то, что списки заметок являются типами аннотаций, а не фактическими классами объектов (builtin или from collections). Не путайте их.

обратите внимание, что Dict , List , Set и FrozenSet все заглавные, где как функции (и имена типов) являются dict, list, set, frozenset. Другими словами, чтобы сделать словарь вы используете dict() или {}, а не Dict.

аннотации являются новыми для 3.0 (не в 2.Н вообще). В обычном интерпретаторе все, что они делают, это заполняют функцию __annotations__ словарь. В интерпретаторе нет ничего, что использует или требует аннотаций.

http://mypy-lang.org/ описывает себя как experiemental проверки текста. Вам нужно посмотреть документацию, чтобы увидеть, насколько она совместима с 484 так далее.

https://docs.python.org/3/library/collections.abc.html#module-collections.abc имеет некоторые абстрактные определения, которые я считаю typing использует. Я никогда ими не пользовался. Они в основном предназначены для людей, разрабатывающих новые классы объектов, а не для "обычных" пользователей.

на typing тег для этого вопроса, вероятно, не является хорошей идеей. У него не так много последователей, и он слишком общий. Он не относится к этому модулю Python.

Поиск [python] 484 для других вопросов SO, связанных с этим стилем аннотаций.

https://github.com/python/typing - the typing репозиторий развития.

в этом репозитории есть FrozenSet определение python2/typing.py файл (задний порт python2), но не в src/typing.py. Я не уверен в значении этого.


тип набора является изменяемым -- содержимое может быть изменено с помощью таких методов, как add() и remove(). Поскольку он является изменяемым, он не имеет хэш-значения и не может использоваться как ключ словаря или как элемент другого набора. Тип frozenset является неизменным и hashable-его содержание не может быть изменено после создания, однако он может быть использован как ключ словаря или как элемент другой набор.

от: https://docs.python.org/3/library/stdtypes.html#frozenset

вам не нужно включать его, он встроен, вы просто делаете:

cities = frozenset(["Frankfurt", "Basel","Freiburg"])

проверено в 3.4.2


два года опоздала на вечеринку, но все равно...

вы можете думать о AbstractSet и MutableSet как интерфейс в Java или абстрактный базовый класс в Python. В Python строение set() и frozenset() являются одной реализацией, но кто-то может создать другую реализацию, которая вообще не использует встроенные.

FrozenSet и Set, С другой стороны, представляют типы бетона, построенного в классах frozenset и set.

например, типы "интерфейс" не имеют union методы, в то время как конкретные типы. Итак:

def merge(a: Set[str], b: Iterable[str]) -> Set[str]:
    return a.union(b)

будет вводить проверку просто отлично, но если вы измените тип a to AbstractSet, mypy говорит:

typetest.py:7: error: "AbstractSet[str]" has no attribute "union"


каждый из них используется для разных вещей.

множества очень похожи на математическую концепцию множеств:https://en.wikipedia.org/wiki/Set_ (математика)

набор в Python по существу представляет собой набор уникальных объектов. Вы можете прочитать больше о наборах, а также посмотреть некоторые примеры здесь:http://www.python-course.eu/python3_sets_frozensets.php

наборы в Python-это коллекция уникальных объектов (все неизменяемые) но FrozenSet является неизменным. Это означает, что вы можете изменить набор, но вы не можете изменить FrozenSet: вам нужно создать новый FrozenSet.

в Python3 FrozenSet является аргументом по умолчанию, называемым "frozenset"