为何mypy未遵循Python默认bool值规则?求可选对象属性访问兼容写法
问题解答
这是不是mypy的问题?
是的,这属于mypy静态类型推断的局限性。
Python规范中,未定义__bool__或__len__方法的类实例,bool()调用默认返回True。但mypy在处理用户自定义类时,不会自动应用这个默认规则——它只会在类显式实现__bool__或__len__时,才会推断实例的真值情况。对于未实现这两个方法的类,mypy会保守地认为实例的真值是不确定的,因此会保留a and a.foobar()返回A类型的可能性,从而触发类型不兼容的报错。
兼容mypy的便捷写法
这里提供几种简洁且能被mypy正确推断的写法:
1. 三元表达式(最简洁)
def foobar(a: A | None) -> int | None: return a.foobar() if a else None
2. 显式条件判断(可读性最高)
def foobar(a: A | None) -> int | None: if a: return a.foobar() return None
3. 强制类型转换(谨慎使用)
如果你确定类实例的真值永远为True,也可以用cast告诉mypy忽略类型检查:
from typing import cast def foobar(a: A | None) -> int | None: return cast(int | None, a and a.foobar())
内容的提问来源于stack exchange,提问作者matheburg
相关产品推荐
相关产品推荐

