Я только что видел следующий пример в PEP 484< /а>:
def greeting(name: str) -> str:
return 'Hello ' + name
print(greeting('Martin'))
print(greeting(1))
Как и ожидалось, это не работает в Python 2:
File "test.py", line 1
def greeting(name: str) -> str:
^
SyntaxError: invalid syntax
Однако это работает для Python 3:
Hello Martin
Traceback (most recent call last):
File "test.py", line 5, in <module>
print(greeting(1))
File "test.py", line 2, in greeting
return 'Hello ' + name
TypeError: Can't convert 'int' object to str implicitly
Это было неожиданно. На самом деле он еще не проверяет типы, как вы можете видеть на следующем примере (он запускается, но не генерирует исключение):
def greeting(name: str) -> int:
return 'Hello ' + name
print(greeting('Martin'))
Кажется, что после :
должно быть имя функции, но функция, похоже, игнорируется:
def aha(something):
print("aha")
return something+"!"
def greeting(name: aha, foo) -> int:
return 'Hello ' + name + foo
print(greeting('Martin', 'ad'))
То же самое верно и для имени после ->
.
Использует ли этот синтаксис подсказки типа что-то еще (например, язык моделирования Java использует комментарии)? Когда этот синтаксис появился в Python? Есть ли способ сделать статическую проверку типов уже с этим синтаксисом? Всегда ли это нарушает совместимость с Python 2?