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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 08:42:48