Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Почему интерпретатор питона не проверяет type hints?

#python #python_3x #language_lawyer #дизайн_языка #типизация


Здравствуйте! В питоне есть type hint`ы, однако код вроде такого:

def add(a: int, b: int) -> int:
    return a + b

add('hello', 'world')


отлично выполняется. Я знаю, что для проверки типов есть внешние утилиты, но не понимаю:
почему синтаксис в язык добавили, а проверки из коробки нет? 

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

Что-то такое, кажется, не сложнее парсить:

#: int, int -> int
def add(a, b):
    return a + b

#: [int]
li = [1,2,3]


В том же js есть "strict mode", который можно включать и выключать по собственному
желанию, мне кажется, что это намного логичнее. Понятно, что задачи у них разные, но
ситуации, кажется, похожи.
    


Ответы

Ответ 1



Type hint'ы введены PEP 484. Держите под рукой. почему синтаксис в язык добавили, а проверки из коробки нет? Вообще на любые вопросы "почему в языке Х нет фичи Y", при отсутствии явного отказа от неё, ответ "не сделали ещё, может быть когда-нибудь". Но в PEP 484 есть предложение, очень похожее на отказ делать это частью языка: It should also be emphasized that Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention. Важно также отметить, что Python останется динамически типизированным языком, и его авторы не намереваются когда-либо делать type hint'ы обязательными, даже если лишь по соглашению. Хотя это напрямую не исключает возможности появления необязательных проверок в стандартной библиотеке, это стало бы существенным шагом в сторону "статической типизации по соглашению", чего авторы языка не хотят. Как бы там ни было, type hint'ы должны стабилизироваться в языке, прежде чем основывать на них такую крупную фичу, как встроеннные проверки. А это случится не раньше Python 3.8. Ведь внешние утилиты могут проверять без какого либо дополнительного синтаксиса Да, но: Каждый анализатор вынужден для этого вводить собственный синтаксис. Возможно, когда-нибудь разные реализации пришли бы к общему де-факто стандарту. А можно сделать "превентивный стандарт", чтобы исключить другие развития событий на корню. Этот синтаксис должен затруднять написание аннотаций, несовместимых с описываемым кодом. Комментарии очень легко сделать несовместимыми с кодом, чтобы это не случилось, нужны дополнительные проверки самого кода. Разбирать сам код на Python разумно парсером Python, а не создавать и поддерживать его кусочек по новой. И если уж заставлять этим заниматься парсер Python, можно интегрировать синтаксис плотнее в язык, например указывать тип аргумента непосредственно рядом с ним. Что уже сделано аннотациями в PEP 3107, но аннотации постепенно становятся только type hint'ами и больше ничем.

Комментариев нет:

Отправить комментарий