def greeting(name: str) -> str:
return 'Hello ' + name
使用 str 调用函数的正确方法
>>> greeting("John")
'Hello John'
如果我用 int 调用它:
>>> greeting(2)
TypeError: must be str, not int
通过列表来电
>>> greeting(["John"])
TypeError: must be str, not list
一切正常吧?
greeting
函数始终接受 str 作为参数。
但是,例如,如果我尝试测试函数返回类型,请使用相同的函数,但将返回类型更改为 int。
def greeting(name: str) -> int:
return 'Hello ' + name
函数返回
str
,但类型定义为int
,并且不会引发异常:
>>> greeting("John")
'Hello John'
另一个例子:
def greeting(name: str) -> str:
return len(name)
>>> greeting("John")
4
虽然 PEP 484 说返回类型预计为
str
,但它实际上并不类似于上面示例中可以看到的参数类型检查。
这表明名称参数的预期类型是 str。 类似地,预期返回类型是str。
我是否遗漏了什么或者没有对返回类型进行类型检查?
PEP 的摘要指出:
虽然这些注释可以在运行时通过通常的方式使用
属性,运行时不会发生类型检查。相反,该提案假设存在一个单独的离线类型检查器,用户可以自愿运行其源代码。本质上,这样的类型检查器充当非常强大的 linter。 (当然,个人用户可以在运行时使用类似的检查器来执行合同设计或 JIT 优化,但这些工具尚未成熟。)__annotations__
这个问题可能会给 python3 类型提示的新手带来一些困惑。 python3 中不支持类型检查。这意味着如果您在参数中传递了错误的类型,Python 解释器将不会引发异常。
如果您需要此功能,可以使用mypy。
在上面的示例中引发
TypeError
的实际原因是不安全地使用 (+)
运算符。
如果您使用字符串格式更改示例中提供的函数
def greeting(name: str) -> str:
return 'Hello {}'.format(name)
上述所有情况都可以在不引发
TypeError
的情况下工作,并且在运行时不会进行类型检查。
Type Hinting 由 PyCharm、PyCharm Type Hinting 等 IDE 使用,但它只是 IDE 显示的警告,而不是 python 解释器显示的警告。