Одной из самых обсуждаемых функций в Python 3.5 являются подсказки типов .
Пример намеков типа упоминается в этой статье , и это одно в то же время , упоминая , чтобы использовать подсказки типа ответственно. Может кто-то объяснить больше о них, и когда они должны использоваться, а когда нет?
python
python-3.x
python-3.5
type-hinting
Vaulstein
источник
источник
Ответы:
Я бы посоветовал прочитать PEP 483 и PEP 484 и посмотреть эту презентацию Гвидо о Type Hinting.
В двух словах : Подсказка типа буквально означает, что означают слова, вы намекаете на тип объекта (ов), который вы используете .
Из-за динамической природы Python вывод или проверка типа используемого объекта особенно сложны. Этот факт мешает разработчикам понять, что именно происходит в коде, который они не написали, и, что наиболее важно, в инструментах проверки типов, имеющихся во многих средах разработки [PyCharm, PyDev], которые ограничены из-за того, что у них нет никакого индикатора того, какого типа объекты. В результате они прибегают к попыткам вывести тип с (как упоминалось в презентации) около 50% успеха.
Чтобы взять два важных слайда из презентации Type Hinting:
Зачем вводить подсказки?
TypeErrors
..
всплывающие методы и атрибуты, которые не определены для объекта.Зачем использовать статические шашки типа?
В качестве заключительного замечания к этому небольшому введению : это дополнительная функция, и, насколько я понимаю, она была введена для того, чтобы пожинать некоторые из преимуществ статической типизации.
Как правило , вам не нужно беспокоиться об этом и определенно не нужно его использовать (особенно в тех случаях, когда вы используете Python в качестве вспомогательного языка сценариев). Это должно быть полезно при разработке больших проектов, поскольку оно предлагает столь необходимую надежность, контроль и дополнительные возможности отладки .
Тип Подсказка с mypy :
Чтобы сделать этот ответ более полным, я думаю, что небольшая демонстрация была бы подходящей. Я буду использовать
mypy
библиотеку, которая вдохновляла Type Hints, поскольку они представлены в PEP. В основном это написано для тех, кто сталкивается с этим вопросом и задается вопросом, с чего начать.Прежде чем я это сделаю, позвольте мне повторить следующее: PEP 484 ничего не применяет; это просто установление направления для аннотаций функций и предложение рекомендаций относительно того, как можно / нужно выполнять проверку типов. Вы можете комментировать свои функции и подсказывать столько вещей, сколько хотите; ваши сценарии будут работать независимо от наличия аннотаций, потому что сам Python их не использует.
В любом случае, как отмечено в PEP, типы подсказок обычно должны принимать три формы:
# type: type
комментарии, которые дополняют первые две формы. (См. Что такое переменные аннотации в Python 3.6? Для обновления Python 3.6 для# type: type
комментариев)Кроме того, вы захотите использовать подсказки типов в сочетании с новым
typing
модулем, представленным вPy3.5
. В нем определены многие (дополнительные) ABC (абстрактные базовые классы), а также вспомогательные функции и декораторы для использования при статической проверке. БольшинствоABCs
изcollections.abc
них включены, но вGeneric
форме, чтобы разрешить подписку (путем определения__getitem__()
метода).Для тех, кто заинтересован в более подробном их объяснении,
mypy documentation
он написан очень красиво и содержит много примеров кода, демонстрирующих / описывающих функциональность их средства проверки; это определенно стоит прочитать.Функция аннотации и специальные комментарии:
Во-первых, интересно наблюдать за поведением, которое мы можем получить при использовании специальных комментариев. Специальные
# type: type
комментарии могут быть добавлены во время назначения переменных, чтобы указать тип объекта, если он не может быть напрямую выведен. Простые назначения, как правило, легко выводятся, но другие, такие как списки (относительно их содержимого), не могут.Примечание: если мы хотим использовать какую-либо производную от
Containers
и должны указать содержимое для этого контейнера, мы должны использовать универсальные типы изtyping
модуля. Они поддерживают индексацию.Если мы добавим эти команды в файл и выполним их с нашим интерпретатором, все будет работать нормально и
print(a)
просто печатает содержимое спискаa
. Эти# type
комментарии были отброшены, рассматриваются как простые комментарии , которые не имеют никакой дополнительной смысловой нагрузки .Запустив это с
mypy
другой стороны, мы получим следующий ответ:Указывает, что список
str
объектов не может содержатьint
, что, статически говоря, является звуком. Это может быть исправлено либо соблюдением типаa
и только добавлениемstr
объектов, либо изменением типа содержимого,a
чтобы указать, что любое значение является приемлемым (интуитивно выполняетсяList[Any]
после того,Any
как было импортировано изtyping
).Аннотации функций добавляются в форму
param_name : type
после каждого параметра в сигнатуре вашей функции, а тип возвращаемого значения указывается с помощью-> type
нотации перед двоеточием конечной функции; все аннотации хранятся в__annotations__
атрибуте этой функции в удобной словарной форме. Используя тривиальный пример (который не требует дополнительных типов изtyping
модуля):annotated.__annotations__
Атрибут теперь имеет следующие значения:Если мы полный нуби, или мы знакомы с
Py2.7
концепциями и, следовательно, не знаем, чтоTypeError
скрывается в сравненииannotated
, мы можем выполнить еще одну статическую проверку, поймать ошибку и избавить нас от некоторых проблем:Помимо прочего, вызов функции с недопустимыми аргументами также будет пойман:
Они могут быть распространены практически на любой сценарий использования, а обнаруженные ошибки распространяются не только на базовые вызовы и операции. Типы, которые вы можете проверить, действительно гибкие, и я просто дал небольшой пик своего потенциала. Посмотрите на
typing
модуль, PEP илиmypy
документы, чтобы дать вам более полное представление о предлагаемых возможностях.Заглушки:
Заглушки могут использоваться в двух разных взаимоисключающих случаях:
Окурки (с расширением
.pyi
) представляют собой аннотированный интерфейс модуля, который вы делаете / хотите использовать. Они содержат сигнатуры функций, которые вы хотите проверить типом, а тело функций отбрасывается. Чтобы почувствовать это, приведем набор из трех случайных функций в модуле с именемrandfunc.py
:Мы можем создать заглушку
randfunc.pyi
, в которую мы можем поместить некоторые ограничения, если захотим. Недостатком является то, что кто-то, просматривающий источник без заглушки, на самом деле не получит помощь при аннотации, пытаясь понять, что и где предполагается передавать.В любом случае, структура заглушки довольно проста: добавьте все определения функций с пустыми телами (
pass
заполненными) и предоставьте аннотации в соответствии с вашими требованиями. Здесь, давайте предположим, что мы хотим работать только сint
типами для наших Контейнеров.combine
Функция дает представление о том , почему вы можете захотеть использовать аннотации в другом файле, они несколько раз не загромождать код и не снижают читаемость (большой нет-нет для Python). Конечно, вы можете использовать псевдонимы типов, но это иногда сбивает с толку больше, чем помогает (поэтому используйте их с умом).Это должно познакомить вас с основными понятиями подсказок типов в Python. Несмотря на то, что используется средство проверки типов,
mypy
вы должны постепенно начать видеть больше всплывающих окон, некоторые из них внутри IDE ( PyCharm ,) и другие как стандартные модули Python. Я попытаюсь добавить дополнительные контрольные / связанные пакеты в следующем списке, когда и если я их найду (или, если предложено).Шашки, которые я знаю :
Связанные пакеты / проекты :
typeshed
Проект на самом деле один из лучших мест , где вы можете посмотреть , чтобы увидеть , как тип намекая может быть использован в проекте самостоятельно. Давайте возьмем в качестве примера в__init__
dunders этогоCounter
класса в соответствующем.pyi
файле:Где
_T = TypeVar('_T')
используется для определения общих классов . ДляCounter
класса мы можем видеть, что он может не принимать аргументы в своем инициализаторе, получать единственныйMapping
тип из любого типаint
или приниматьIterable
любой тип.Обратите внимание : я забыл упомянуть, что
typing
модуль был введен на временной основе . От ОПТОСОЗ 411 :Так что возьмите вещи здесь с щепоткой соли; Я сомневаюсь, что это будет удалено или изменено значительными способами, но никто никогда не может знать.
** Еще одна тема, но действительная в контексте подсказок типов:
PEP 526
Синтаксис для аннотаций переменных - это попытка заменить# type
комментарии введением нового синтаксиса, который позволяет пользователям аннотировать тип переменных в простыхvarname: type
выражениях.Смотрите Что такое переменные аннотации в Python 3.6? Как уже упоминалось, для небольшого вступления по этим.
источник
Добавляем к сложному ответу Джима:
Проверьте
typing
модуль - этот модуль поддерживает подсказки типа, как указано в PEP 484 .Например, нижеприведенная функция принимает и возвращает значения типа
str
и помечается следующим образом:typing
Модуль также поддерживает:источник
Недавно выпущенный PyCharm 5 поддерживает подсказки типа. В своем блоге об этом (см. Подсказки типов Python 3.5 в PyCharm 5 ) они предлагают отличное объяснение того, что такое подсказки типов, и не приводятся вместе с несколькими примерами и иллюстрациями того, как использовать их в вашем коде.
Кроме того, он поддерживается в Python 2.7, как объясняется в этом комментарии :
источник
Подсказка к типу - это недавнее дополнение к динамическому языку, где на протяжении десятилетий люди давали такие простые соглашения, как венгерский (обозначение объекта с первой буквой b = boolian, c = символ, d = словарь, i = целое число, l = список, n = число , s = string, t = tuple) были не нужны, слишком громоздки, но теперь решили, что, подождите ... слишком много проблем с использованием языка (type ()) для распознавания объектов и наших модных IDE нужна помощь в выполнении чего-либо такого сложного, и что динамически назначаемые значения объектов в любом случае делают их совершенно бесполезными, в то время как простое соглашение об именах могло бы решить все это для любого разработчика одним взглядом.
источник
Подсказки к типу предназначены для удобства сопровождения и не интерпретируются Python. В приведенном ниже коде строка
def add(self, ic:int)
не приводит к ошибке до следующейreturn...
строки:источник