Каковы различия между 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"