为什么Python3中不检查返回类型? [重复]

问题描述 投票:0回答:2

来自 PEP 484 的示例 -- 类型提示

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。

我是否遗漏了什么或者没有对返回类型进行类型检查?

python function python-typing
2个回答
7
投票

PEP 的摘要指出:

虽然这些注释可以在运行时通过通常的方式使用

__annotations__
属性,运行时不会发生类型检查。相反,该提案假设存在一个单独的离线类型检查器,用户可以自愿运行其源代码。本质上,这样的类型检查器充当非常强大的 linter。 (当然,个人用户可以在运行时使用类似的检查器来执行合同设计或 JIT 优化,但这些工具尚未成熟。)


4
投票

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

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

mypy

在上面的示例中引发

TypeError
的实际原因是不安全地使用
(+)
运算符。 如果您使用字符串格式更改示例中提供的函数

def greeting(name: str) -> str:
    return 'Hello {}'.format(name)

上述所有情况都可以在不引发

TypeError
的情况下工作,并且在运行时不会进行类型检查。

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

© www.soinside.com 2019 - 2024. All rights reserved.