首页 > 解决方案 > 具有显式调用的字符串的真值和假值

问题描述

Python 中的非空字符串应该具有真值。为什么如果我显式调用该__bool__()函数,会出现错误?如果我使用一个if语句,它似乎在评估。

>>> myvar = 'test'
>>> myvar.__bool__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__bool__'
>>> if myvar:
...     print("myvar TRUTHY")
...
myvar TRUTHY
>>>

标签: python

解决方案


字符串没有__bool__()方法(这是错误告诉你的)。相反,python 将调用__len__()该字符串,如果它不为零,则返回 True。正如python数据模型提到的:

当此方法未定义时__len__(),如果已定义,则调用该方法,如果其结果为非零,则认为该对象为真。如果一个类既不定义__len__()也不定义__bool__(),它的所有实例都被认为是真的。

您可以通过创建UserString(or str) 的子类并注意何时__len__()调用来验证这一点。当您在布尔上下文中使用字符串时,它将被调用:

from collections import UserString

class myString(UserString):
    def __len__(self):
        print("length called")
        return super().__len__()
    
s = myString("hello")

if s:
    pass
# prints "length called"

bool(s)
# length called
# True

推荐阅读