为何mypy无法捕获main()函数中的类型错误?
mypy无法捕获函数内类型不兼容错误的原因
现象说明
- 当代码在全局作用域创建
MyClass实例时,mypy能正常捕获类型不兼容错误:
class MyClass(): def __init__(self, a: int): pass channel = MyClass(0.) # mypy会报错:Argument 1 has incompatible type "float"; expected "int"
- 但把相同逻辑放到未标注类型的函数内时,mypy无法捕获错误:
class MyClass(): def __init__(self, a: int): pass def main(): channel = MyClass(0.) # mypy无报错 if __name__ == "__main__": main()
核心原因
mypy的默认行为是:不对未添加类型注解的函数内部代码做类型检查。
你代码里的main函数没有任何类型注解(比如返回值注解-> None),mypy会将其判定为“未类型化函数”,直接跳过内部的类型校验逻辑。而全局作用域的代码不在这个豁免范围内,所以第一个场景能被正常检查。
解决办法
有两种方式可以让mypy检查这类函数:
- 给函数添加类型注解,比如给
main加上返回值注解:
def main() -> None: channel = MyClass(0.)
- 在运行mypy时添加
--check-untyped-defs参数,强制检查所有未标注类型的函数。
内容的提问来源于stack exchange,提问作者DJames
相关产品推荐
相关产品推荐

