You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python是否正在向静态类型编程语言方向发展?

Python类型注解为啥不报错?看完你就懂了

核心原因:Python类型注解是“提示”不是“强制”

和TypeScript不一样,Python的类型注解完全不影响代码运行——解释器会直接跳过这些注解,该执行还是执行。所以你传个1.0(float类型)给标注了str | int的参数,不管是IDE(没配静态检查工具的话)还是运行python main.py,都不会直接报错,因为Python本身不做类型校验。

你的代码为啥没触发报错?

你在函数里写了类型检查,但犯了个小错:你只是返回了TypeError对象,没有用raise抛出它。Python不会把返回的异常对象当成错误处理,所以程序只会悄悄返回这个对象,不会终止也不会给你提示。

另外,用type(input) == str这种判断方式不够灵活,要是有个类继承自str,这种判断就会失效,换成isinstance(input, (str, int))更靠谱。

想要类型校验?这么做

1. 手动抛出异常(最简单)

把返回异常改成抛出异常,这样传错类型时直接报错:

def Speak(input: str | int) -> None:
    if not isinstance(input, (str, int)):
        raise TypeError("type not supported")

    if isinstance(input, str):
        print("str")
    elif isinstance(input, int):
        print("int")

Speak(1.0)  # 运行时会报错:TypeError: type not supported

2. 用静态检查工具提前发现问题

比如用mypy,安装后运行mypy main.py,它会像TypeScript一样检查类型注解,提前告诉你Speak(1.0)参数类型不匹配。很多IDE(比如VS Code)也能集成mypy,写代码时就给你提示。

3. 第三方库做运行时校验

比如typeguard,安装后用@typechecked装饰器就能自动校验类型:

from typeguard import typechecked

@typechecked
def Speak(input: str | int) -> None:
    if isinstance(input, str):
        print("str")
    elif isinstance(input, int):
        print("int")

Speak(1.0)  # 运行时直接报错

内容的提问来源于stack exchange,提问作者Jason Rich Darmawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:31:17