在列表对象的实例上调用IF语句时,是否存在用于评估返回True还是False的魔术方法?例如,
a = []
b = [1, 2, 3]
if a == b: # <---- __eq__() is called and returns False
pass
if a: # <---- what is called here that returns False?
pass
是吗? a .__ bool__(a .__ nonzero__)? a .__ len __?
还是其他东西?
答案 0 :(得分:2)
实验时间!
class Falsy:
def __nonzero__(self):
print("it's __nonzero__")
return False
def __len__(self):
print("it's __len__")
return 0
def __bool__(self):
print("it's __bool__")
return False
def __eq__(self, other):
print("it's __eq__")
return False
if Falsy():
pass
# => it's __bool__
您可以尝试删除这些方法,以确认对它们进行测试的优先级(对于Python 3,__bool__
,然后是__len__
)。
答案 1 :(得分:2)
@ymonad只需参考以下文档即可在问题的评论中提供最佳答案:
https://docs.python.org/3/library/stdtypes.html#truth-value-testing
我不想为此感到荣誉。当最佳答案甚至不是答案时,我就是无法解决。如果可以简单地指向文档,那将永远是最好的答案。
... grrrr ...嘿@ymonad,我能给你赏金或其他什么吗,大声笑?
答案 2 :(得分:0)
摘自文档https://docs.python.org/2/reference/datamodel.html#object.nonzero:
__exit__
被调用以实现真值测试和内置操作object.__nonzero__(self)
;应该返回bool()
或False
或它们的等效整数True
或0
。如果未定义此方法,则调用1
(如果已定义),并且如果其结果为非零,则认为该对象为true。如果某个类既未定义__len__()
也未定义__len__()
,则其所有实例均被视为true。
对于Python 3 https://docs.python.org/3.7/reference/datamodel.html#object.nonzero:
__nonzero__()
被调用以实现真值测试和内置操作object.__bool__(self)
;应该返回bool()
或False
。如果未定义此方法,则调用True
(如果已定义),并且如果其结果为非零,则认为该对象为true。如果某个类既未定义__len__()
也未定义__len__()
,则其所有实例均被视为true。
尝试:
__bool__()
答案 3 :(得分:0)
咨询PyList的C-Python API文档...
https://docs.python.org/3.7/c-api/list.html
...我们可以看到没有列表特定的“ as bool”功能。唯一可以返回“真”值的是PyList_Size(PyObject *list)
,因此答案必须为a.__len__()
。
免责声明:至少对于CPython。
答案 4 :(得分:-1)