Подтвердить что ты не робот

Как использовать подсказки типа в 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 обнаружил ошибку типа и предупредил об этом, но это было не очевидно и не было показано в выходной консоли, я боялся, что иногда я мог бы пропустить это. Мне бы хотелось получить следующие эффекты:

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

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

4b9b3361

Ответ 1

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

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

С помощью mypy as есть, поскольку выпуск свежий, вам нужно установить 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 и PyCharm s-type-checkers - это те, которые выполняют проверку, а не сам Python. Python не использует эту информацию в настоящее время, она хранит ее только как метаданные и игнорирует ее во время выполнения.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

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