После того, как вопрос был задан и получен ответ, в Python были добавлены подсказки типа . Подсказки типов в Python позволяют проверять типы, но совсем не так, как в статически типизированных языках. Подсказки типов в Python связывают ожидаемые типы аргументов с функциями как доступные во время выполнения данные, связанные с функциями, и это позволяет проверять типы. Пример синтаксиса подсказки типа:
def foo(i: int):
return i
foo(5)
foo('oops')
В этом случае мы хотим, чтобы ошибка была вызвана для foo('oops')
, поскольку аннотированный тип аргумента - int
. Добавленная подсказка типа не вызывает ошибку при нормальной работе скрипта. Однако в функцию добавляются атрибуты, описывающие ожидаемые типы, которые другие программы могут запрашивать и использовать для проверки ошибок типов.
Одной из этих других программ, которые можно использовать для обнаружения ошибки типа, является mypy
:
mypy script.py
script.py:12: error: Argument 1 to "foo" has incompatible type "str"; expected "int"
(Вам может понадобиться установить mypy
из вашего менеджера пакетов. Я не думаю, что он поставляется с CPython, но, похоже, имеет некоторый уровень «официальности».)
Проверка типов этим способом отличается от проверки типов в статически типизированных компилируемых языках. Поскольку в Python типы являются динамическими, проверка типов должна выполняться во время выполнения, что требует затрат - даже для правильных программ - если мы настаиваем на том, чтобы это происходило при каждом удобном случае. Явные проверки типов также могут быть более строгими, чем необходимо, и приводить к ненужным ошибкам (например, действительно ли аргумент должен иметь тип точно list
или достаточно итеративно?).
Преимуществом явной проверки типов является то, что она может отлавливать ошибки раньше и давать более четкие сообщения об ошибках, чем утка. Точные требования к типу утки могут быть выражены только с помощью внешней документации (надеюсь, она тщательная и точная), и ошибки несовместимых типов могут возникать далеко от места их возникновения.
Подсказки типов в Python предназначены для компромисса, когда типы можно указывать и проверять, но при обычном выполнении кода никаких дополнительных затрат не возникает.
Пакет typing
предлагает переменные типа, которые можно использовать в подсказках типов для выражения необходимого поведения, не требуя определенных типов. Например, он содержит переменные, такие как Iterable
и Callable
для подсказок, чтобы указать необходимость любого типа с этими поведениями.
В то время как подсказки типов являются наиболее Pythonic способом проверки типов, часто Pythonic вообще не проверяет типы вообще и полагается на типизацию утки. Типовые подсказки являются относительно новыми, и жюри все еще остается в стороне, когда они являются наиболее питонским решением. Относительно неоспоримое, но очень общее сравнение: подсказки типов предоставляют форму документации, которую можно применять, позволяют генерировать код раньше и легче понимать ошибки, могут отлавливать ошибки, которые не могут быть введены при печати, и могут быть проверены статически (в необычном смысл, но это все еще вне времени выполнения). С другой стороны, типирование утки долгое время оставалось Pythonic, оно не накладывает когнитивных издержек на статическую типизацию, менее многословно и будет принимать все жизнеспособные типы, а затем и некоторые.