为啥 Python 不使用“-> 类型”函数定义抛出类型异常? [复制]

Posted

技术标签:

【中文标题】为啥 Python 不使用“-> 类型”函数定义抛出类型异常? [复制]【英文标题】:Why Python doesn't throws type exceptions with '-> type' functions definitions? [duplicate]为什么 Python 不使用“-> 类型”函数定义抛出类型异常? [复制] 【发布时间】:2016-12-17 23:33:01 【问题描述】:

在其他语言中,类似示例的任何内容都会引发类型错误。为什么不用 Python?

>>> def foo(a:int) -> str:
    return a+1

>>> foo(5)
6

【问题讨论】:

【参考方案1】:

Python 中的类型提示是一个可选添加,以帮助静态代码分析和编辑器。

来自PEP 484 -- Type Hints specification:

请注意,此 PEP 仍然明确不阻止注释的其他用途,也不需要(或禁止)对注释进行任何特定处理,即使它们符合本规范。它只是实现了更好的协调,就像 PEP 333 对 Web 框架所做的那样。

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

请注意,类型提示是 Python 的新增功能,PEP 旨在帮助协调,而不是强制对语言进行运行时类型检查。

Python 不是静态类型语言,它仍然是非常动态类型的。您可能会将此功能与静态类型语言中的类型声明混淆。

将来,可能 Python 可能会添加对严格模式的支持(类似于 Hack does this),但目前还没有。

【讨论】:

以上是关于为啥 Python 不使用“-> 类型”函数定义抛出类型异常? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 c++11 中的 lambda 函数没有 f​​unction<> 类型?

为啥 Python 3.8.0 允许在不使用“非本地”变量的情况下从封闭函数范围更改可变类型?

为啥python使用eval函数输出结果有很多尾数

Python 函数退出不起作用 - 为啥? [复制]

为啥 Python 中的字典和列表不继承 'len' 函数

Python:不明白为啥在 GUI“command=”中需要 lambda 来调用函数 [重复]