2016-03-10 4 views
5

Я пытаюсь аннотировать мой код типами, но я немного смущен, когда дело доходит до множеств. Я прочитал несколько пунктов в PEP 484:Каковы различия между Set, FrozenSet, MutableSet и AbstractSet в модуле ввода python?

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

и

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

но это не поможет.

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

Мой второй вопрос: почему, если я пытаюсь

from collections import FrozenSet 

Я получаю

ImportError: cannot import name 'FrozenSet' 

?

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

ответ

3

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

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

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

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

То, что в списках заметок есть типы аннотаций, а не фактические классы объектов (встроенные или от collections). Не путайте их.

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

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

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

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

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

Искать [python] 484 для других вопросов, касающихся этого стиля аннотаций.

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

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

+0

Привет, спасибо за ваш ответ. Теперь у меня есть более ясные идеи (я знал о различии между типами аннотаций и объектами, но не знал о том, как набирать команды mypy vs python3.5). Однако я просмотрел документацию и не смог найти ссылку на FrozenSet, о которой упоминалось в PEP 484. Я что-то упустил? – marcotama

+0

Похоже, что они не добавили 'FrozenSet' в' typing'. Многие из классов в 'typing' отображаются на' collections.abc', которые имеют такие вещи, как 'MutableSet' и' AbstractSet', но не 'FrozenSet'. Таким образом, на данный момент «FrozenSet» - это просто идея в PEP, не более того. – hpaulj

+0

Для модуля 'typing' существует репозиторий github. Изучите это, чтобы узнать, что можно добавить в будущем. – hpaulj

-1

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

Наборы очень похожи на математической концепции множеств: https://en.wikipedia.org/wiki/Set_(mathematics)

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

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

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

+0

Привет, как я ответил lciamp, я знаю разницу между set и frozenset. Мой вопрос был специфичен для модуля ввода, таким образом, прописные буквы. Прошу прощения, если я не понял. – marcotama

0

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

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

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

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

испытания в 3.4.2

+0

Спасибо, я знаю эти различия. Вопрос состоял в том, как эти типы отображаются в модуле ввода. Прошу прощения, если я не понял. – marcotama