为什么在python3中没有检查返回类型?

dem*_*nno 5 python types function typechecking python-3.x

PEP 484示例- 类型提示

def greeting(name: str) -> str:
    return 'Hello ' + name
Run Code Online (Sandbox Code Playgroud)

用str调用函数的正确方法

>>> greeting("John")
'Hello John'
Run Code Online (Sandbox Code Playgroud)

如果我用int调用它:

>>> greeting(2)
TypeError: must be str, not int
Run Code Online (Sandbox Code Playgroud)

用列表打电话

>>> greeting(["John"])
TypeError: must be str, not list
Run Code Online (Sandbox Code Playgroud)

一切正常吗?greeting函数总是接受str作为参数.

但是,如果我尝试测试函数返回类型,例如,使用相同的函数但将返回类型更改为int.

def greeting(name: str) -> int:
    return 'Hello ' + name
Run Code Online (Sandbox Code Playgroud)

函数返回str但类型定义为int,并且不会引发异常:

>>> greeting("John")
'Hello John'
Run Code Online (Sandbox Code Playgroud)

另一个例子:

def greeting(name: str) -> str:
    return len(name)

>>> greeting("John")
4
Run Code Online (Sandbox Code Playgroud)

尽管PEP 484表示返回类型是预期的str,但它实际上并不类似于参数类型检查,这可以在上面的例子中看到.

这表明name参数的预期类型是str.类似地,预期的返回类型是str.

我错过了什么或没有返回类型的类型检查?

str*_*her 7

PEP 的摘要指出:

虽然这些注释在运行时通过常用的注释属性可用,但在运行时 不会进行类型检查.相反,该提议假定存在一个单独的离线类型检查器,用户可以自动运行其源代码.从本质上讲,这种类型的检查器就像一个非常强大的linter.(虽然个别用户当然可以在运行时使用类似的检查器来进行设计合同执行或JIT优化,但这些工具还不够成熟.)


dem*_*nno 4

这个问题可能会给 python3 类型提示的新手带来一些困惑。python3 中不支持类型检查。这意味着如果您在参数中传递了错误的类型,Python 解释器将不会引发异常。

如果您需要此功能,可以使用mypy 。

上面例子中引发的实际原因TypeError(+)操作符的不安全使用。如果您使用字符串格式更改示例中提供的函数

def greeting(name: str) -> str:
    return 'Hello {}'.format(name)
Run Code Online (Sandbox Code Playgroud)

上述所有情况都无需 raise 即可工作TypeError,并且在运行时不会进行类型检查。

Type Hinting 由 PyCharm 等 IDE 使用,PyCharm Type Hinting,但它只是 IDE 显示的警告,而不是 python 解释器显示的警告。