Как использовать набор текста Python3.5 в качестве проверок во время выполнения?

Я использую модуль ввода Python3.5, чтобы предоставлять подсказки типа моим классам и функциям. Он хорошо работает с PyCharm, поскольку использует эти подсказки.

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

Текущее состояние:

In [1]: def times2(number: int):
   ...:     return number + number
   ...: 

In [2]: times2(8)
Out[2]: 16

In [3]: times2('8')
Out[3]: '88'

Желаемое состояние:

In [1]: def times2(number: int):
   ...:     return number + number
   ...: 

In [2]: times2(8)
Out[2]: 16

In [3]: times2('8')
Out[3]: Assertion error: '8' is not an int

Могу ли я каким-то образом заставить Python делать это?


person petrbel    schedule 20.01.2017    source источник
comment
Нет, ты не можешь.   -  person Daniel Roseman    schedule 20.01.2017
comment
Может быть, вам подойдет проверка типов во время компиляции? mypy   -  person juanpa.arrivillaga    schedule 20.01.2017


Ответы (2)


Вы можете использовать такое утверждение:

def times2(number: int):
    assert type(number) is IntType, "number is not an int: %r" % number
    return number + number

Или я неправильно истолковал ваш вопрос?

person Alfie    schedule 20.01.2017
comment
Я могу объяснить концепцию утверждений, как и где их использовать, если хотите? - person Alfie; 20.01.2017
comment
ну, это желаемое поведение, однако я думал, что это каким-то образом автоматически приведет к этому, просто написав подсказку типа выше. Да ладно спасибо - person petrbel; 20.01.2017
comment
@petrbel о, да, нет, вам нужно будет использовать утверждение или, возможно, выбросить исключение - person Alfie; 20.01.2017
comment
конечно, но моя точка зрения не заключалась в том, чтобы делать это явно, но позволил питону сделать это сам, предоставив только подсказку типа. В любом случае mypy кажется довольно удобным, так что я попробую :) спасибо - person petrbel; 20.01.2017

Из https://www.python.org/dev/peps/pep-0484/#non-goals

Хотя предлагаемый модуль ввода будет содержать некоторые строительные блоки для проверки типов во время выполнения, […] необходимо разработать сторонние пакеты для реализации конкретных функций проверки типов во время выполнения.

и

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

Типизация Python спроектирована как своего рода инструмент lint, так что разработчик может проверить, правильно ли его код вызывает другой код (насколько поддерживает набор текста - типы проверяются, но вы все равно можете иметь недопустимые значения!). Он не предназначен для проверок во время выполнения и не предназначен для проверки или отклонения пользовательского ввода. Другие библиотеки могут основываться на концепциях набора текста для их реализации в stdlib (https://docs.python.org/3/library/dataclasses.html) или стороннего (https://github.com/search?q=python+runtime+typing&type=Repositories).

person Éric Araujo    schedule 09.04.2019