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
相关产品推荐
相关产品推荐

