具有显式调用的字符串的真值和假值

sla*_*pha 0 python

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
>>>
Run Code Online (Sandbox Code Playgroud)

Mar*_*yer 7

字符串没有__bool__()方法(这是错误告诉你的)。相反,__len__()如果字符串不为零,python 将调用该字符串并返回 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
Run Code Online (Sandbox Code Playgroud)