Я только что видел следующий пример в 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?