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

时间:2017-08-25 07:10:22

标签: python python-3.x function types typechecking

来自PEP 484 -- Type Hints

的示例
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,但它实际上并不类似于参数类型检查,这可以在上面的例子中看到。

  

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

我是否遗漏了某些内容,或者没有针对退货类型的类型检查?

2 个答案:

答案 0 :(得分:7)

PEP的abstract声明:

  

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

答案 1 :(得分:2)

这个问题可能会引起新手对python3类型提示的一些混淆。 python3中没有类型检查支持。这意味着如果在参数中传递了错误的类型,python解释器不会引发异常。

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

mypy

在上面的示例中提出TypeError的实际原因是对(+)运算符的使用不安全。 如果使用字符串格式更改示例中提供的功能

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

所有上述情况都可以在不提出TypeError的情况下工作,并且在运行时不会进行类型检查。

类型提示由像PyCharm,PyCharm Type Hinting这样的IDE使用,但它只是IDE显示的警告,而不是python解释器。