这里没有类型提示。您所做的只是提供 注释 ;这些是在PEP 3107中引入的(仅在Python 3中,在Python 2中不支持此功能);它们允许您注释参数并使用任意信息返回值以供以后检查:
>>> greeting.__annotations__
{'name': <class 'str'>, 'return': <class 'str'>}
否则,此处完全不咨询他们。相反,您收到的错误消息来自尝试 在函数主体中 串联字符串和整数值:
>>> 'Hello ' + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
这是一个自定义类型错误,旨在提供有关str
+int
级联失败的其他信息;str.__add__
对于任何非以下类型,该方法都会将其抛出str
:
>>> ''.__add__(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> ''.__add__(True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'bool' object to str implicitly
然后,PEP 484建议利用这些注释,通过 其他工具 进行实际的静态类型检查,但作为PEP的介绍如下:
尽管这些注释可以在运行时通过常用__annotations__
属性使用, 但在运行时不会进行类型检查 。相反,该建议假设存在一个单独的脱机类型检查器,用户可以自愿在其源代码上运行该检查器。本质上,这种类型检查器可充当非常强大的linter。
强调原始。
PEP受到使用PEP 3107注释的现有工具的启发;特别是mypy项目(通过采用PEP 484循环返回),还包括PyCharm IDE和pytypedecl项目中的类型提示支持。请参阅Guido van Rossum发动这项工作的原始电子邮件以及后续电子邮件。
mypy显然可以通过预处理注释来支持Python 2,在为源字节进行字节编译之前将其删除,但是通常您不能使用本来可以在Python 2中使用的语法Python代码。
PEP 484还描述了存根文件的使用,该存根文件位于常规Python文件的旁边。它们使用.pyi
扩展名,并且仅包含签名(带有类型提示),而使主.py
文件注释自由,因此可以在Python 2上使用(前提是您另外编写了Polyglot Python代码)。