Python中非空字符串为真值,为何显式调用__bool__()报错但if判断正常?
为什么字符串没有
__bool__()但if判断能正常做真值检测? 这问题问得挺戳中Python底层逻辑的,我来给你拆解清楚:
首先得明确:Python的真值判断(Truth Value Testing)不是只靠__bool__()方法的,它有一套优先级规则:
- 当你用
if obj、bool(obj)这类方式判断对象真值时,Python会先尝试调用对象的__bool__()方法; - 如果对象没有实现
__bool__(),就会转而调用__len__()方法:如果返回值为0,就判定为False,否则为True; - 如果连
__len__()都没实现,默认返回True。
回到字符串的场景:
- str类型没有实现
__bool__()方法,所以你直接调用myvar.__bool__()会触发AttributeError,这很正常; - 但str实现了
__len__()方法,当你用if myvar判断时,Python自动走了__len__()的逻辑:非空字符串的长度大于0,所以被判定为Truthy,执行print语句。
你可以用空字符串验证这个逻辑:
>>> empty_str = "" >>> bool(empty_str) False >>> empty_str.__len__() 0
不止字符串,像列表、字典这类容器类型都是这个逻辑——空容器因为__len__()返回0被判定为False,非空则为True,它们同样没有__bool__()方法。
内容的提问来源于stack exchange,提问作者slantalpha
相关产品推荐
相关产品推荐

