Как использовать подсказки типов в python 3.6?

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

from typing import List

a: List[str] = []
a.append('a')
a.append(1)
print(a)

что меня удивило, так это то, что python не дал мне ошибку или предупреждение, хотя 1 был присоединен к list, который должен содержать только строки. Pycharm обнаружил ошибку типа и дал мне предупреждение об этом, но это было не очевидно, и это не было показано в выходной консоли, я боялся иногда я могу пропустить это. Я хотел бы следующие эффекты:

  1. если очевидно, что я использовал неправильный тип, как показано выше, выбросьте предупреждение или ошибку.
  2. если компилятор не может надежно проверить, был ли тип, который я использовал, правильным или неправильным, игнорируйте его.

это возможно? Может быть!--4--> может это сделать, но я бы предпочел использовать проверку типа python-3.6-style(например,a: List[str]) вместо стиля комментария (например,# type List[str]) в mypy. И мне любопытно, есть ли переключатель в родном python 3.6 для достижения двух пунктов, которые я сказал выше.

3 ответов


это возможно? Возможно, mypy мог бы это сделать, но я бы предпочел использовать проверку типа Python-3.6-style (например,a: List[str]) вместо стиля комментария (например,# type List[str]) используется в mypy. И мне любопытно, есть ли переключатель в родном python 3.6 для достижения двух пунктов, которые я сказал выше.

нет никакого способа Python сделает это для вас; вы можете использовать mypy чтобы получить проверку типа (и встроенная проверка PyCharms тоже должна это сделать). В дополнение к этому, mypy и не ограничивает вы только комментарии типа # type List[str], вы можете использовать аннотации переменных, как в Python 3.6 so a: List[str] работает одинаково хорошо.

С mypy как есть, потому что релиз свежий, вам нужно будет установить typed_ast и выполнить mypy С --fast-parser и --python-version 3.6 как описано в документах mypy. Это, вероятно, скоро изменится, но сейчас вам понадобятся они, чтобы запустить его гладко

обновление: --fast-parser и --python-version 3.6 не нужны сейчас.

после этого, mypy обнаруживает несовместимость вторая операция на a: List[str] просто отлично. Допустим, ваш файл называется tp_check.py с заявлениями:

from typing import List

a: List[str] = []
a.append('a')
a.append(1)
print(a)

под управлением mypy с вышеупомянутыми аргументами (вы должны pip install -U typed_ast):

python -m mypy --fast-parser --python-version 3.6 tp_check.py

ловит ошибки:

tp_check.py:5: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"

как отмечает во многих других ответы на тип намеков с Python, mypy и PyCharmS' Type-checkers-это те, которые выполняют проверку,не сам Python. Python не использует эту информацию в настоящее время, он сохраняет ее только как метаданные и игнорирует ее во время выполнения.


подсказки типа полностью предназначены для игнорирования средой выполнения Python и проверяются только сторонними инструментами, такими как mypy и интегрированная проверка Pycharm. Существует также множество менее известных сторонних инструментов, которые выполняют проверку типов во время компиляции или во время выполнения, используя аннотации типов, но большинство людей используют mypy или интегрированную проверку Pycharm AFAIK.

на самом деле, я действительно сомневаюсь, что проверка типов когда-либо будет интегрирована в Python в обозримом будущем-см. раздел "не-цели"PEP 484 (который ввел аннотации типа) и PEP 526 (который ввел аннотации переменных), а также комментарии Гвидо здесь.

Я лично был бы доволен тем, что проверка типов более тесно интегрирована с Python, но не похоже, что сообщество Python в целом готово или готово к такому изменению.

последняя версия mypy должна понимать как переменную Python 3.6 синтаксис аннотаций и синтаксис стиля комментариев. Фактически, аннотации переменных были в основном идеей Гвидо в первую очередь (Гвидо в настоящее время является частью команды mypy) - в основном, поддержка аннотаций типов в mypy и в Python была разработана практически одновременно.


аннотации типов в Python не предназначены для применения типов. Все, что связано с зависимостью статического типа среды выполнения, будет означать изменения настолько фундаментальные, что даже не имеет смысла продолжать называть результирующий язык "Python".

обратите внимание, что динамическая природа Python позволяет создавать внешний инструмент, используя код pure-python, для выполнения проверки типа среды выполнения. Это заставит программу работать (очень) медленно, но, возможно, она подходит для определенного теста категории.

чтобы быть уверенным-одним из основ языка Python является то, что все является объектом, и что вы можете попытаться выполнить любое действие над объектом во время выполнения. Если у объекта не будет интерфейса, соответствующего предпринятой операции, он завершится ошибкой - во время выполнения.

языки, которые по своей природе статически типизированы, работают по-другому: операции просто должны быть доступны для объектов при попытке во время выполнения. На этапе компиляции компилятор создает пробелы и слоты для соответствующих объектов повсюду - и, при несоответствующем типировании, разрывает компиляцию.

проверка типов Python позволяет любому количеству инструментов делать именно это: прерывать и предупреждать на шаге до фактического запуска приложения (но независимо от самой компиляции). Но природа языка не может быть изменена, чтобы фактически требовать, чтобы объекты соответствовали во время выполнения - и veryfying ввода и разрыва на этапе компиляции сама по себе она была бы искусственной.

хотя можно ожидать, что будущие версии Python могут incoroporate время компиляции typechecking на самой среде выполнения Python-скорее всего, через и необязательный переключатель командной строки. (Я не думаю, что это когда - либо будет по умолчанию - по крайней мере, не сломать сборку-возможно, это может быть сделано по умолчанию для выдачи предупреждений)

таким образом, Python не требует статической проверки типов во время выполнения, потому что он перестанет быть Python. Но хотя бы один язык существует, который использует как динамические объекты, так и статическую типизацию - язык Cython, который на практике работает как надмножество Python. Следует ожидать на Cython чтобы включить новый синтаксис намеков на тип, чтобы быть фактическим объявлением типа очень скоро. (В настоящее время он использует другой синтаксис для необязательных статически типизированных переменных)