подсказка типа подходит для аргументов функции, но не для возвращаемого типа

Я новичок в Python и был счастлив открыть для себя функцию подсказки типов в Python3. Я прочитал PEP 484 и нашел этот вопрос о SO, в котором человек, задававший вопрос, задавался вопросом, почему тип возвращаемого значения функции не проверялся. Респондент указал на раздел в PEP 484, в котором говорится, что проверка не происходит во время выполнения и что предполагается, что подсказка типа должна быть проанализирована внешней программой.

Я запустил python3 REPL и решил попробовать

>>> def greeting() -> str: return 1
>>> greeting()
1

Все идет нормально. Мне стало интересно узнать о параметрах функции, поэтому я попробовал следующее:

>>> def greeting2(name: str) -> str: return 'hi ' + name
>>> greeting2(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in greeting2
TypeError: Can't convert 'int' object to str implicitly

Вот где кажется, что колеса отрываются, потому что кажется, что, по крайней мере, в отношении параметров функции, проверка ЕСТЬ. У меня вопрос: почему проверяются параметры, но не тип возвращаемого значения?


person snerd    schedule 12.01.2017    source источник
comment
Это не проверка типов, вы получите эту ошибку без подсказок типов. Python - это строго типизированный язык.   -  person juanpa.arrivillaga    schedule 12.01.2017
comment
Он не проверяет типы параметров функции, поскольку позволяет вызывать greeting2 с целым числом, а не строкой.   -  person Simeon Visser    schedule 12.01.2017


Ответы (1)


Python не использует подсказки типа во время выполнения (ни для параметров функции, ни для возвращаемого типа). Это ничем не отличается от:

>>> def greeting3(name): return 'hi ' + name
...
>>> greeting3(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in greeting3
TypeError: Can't convert 'int' object to str implicitly

Вы получаете эту ошибку TypeError, потому что пытаетесь объединить строку и целое число:

>>> 'hi ' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

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

person Simeon Visser    schedule 12.01.2017
comment
аааааааааааааааааааааааааааааа. хорошо, это имеет гораздо больший смысл. и мне следовало уделить больше внимания тексту ошибки. т / у за оперативную реакцию! - person snerd; 12.01.2017