我不明白Ellipsis
和None
对bool()
的处理方式有何不同,当两者在真值测试的相关属性方面看起来完全相同时。
>>> bool(Ellipsis)
True
>>> bool(None)
False
>>> any([hasattr(Ellipsis, attr) for attr in ['__len__', '__bool__', '__nonzero__']])
False
>>> any([hasattr(None, attr) for attr in ['__len__', '__bool__', '__nonzero__']])
False
我还缺少其他用于真相测试的东西吗?
是否有任何其他对象(None
除外)评估为False
且未实现__len__
或__nonzero__
?
答案 0 :(得分:8)
bool(x)
True
x
如果False
是一个对象而没有您提到的返回Ellipsis
的魔术方法之一。这就是True
评估为None
的原因。
bool()
中{p> False
为special-cased,并返回bool()
。
<强>详细信息:强>
PyObject_IsTrue()
使用int
PyObject_IsTrue(PyObject *v)
{
Py_ssize_t res;
if (v == Py_True)
return 1;
if (v == Py_False)
return 0;
if (v == Py_None)
return 0;
else if (v->ob_type->tp_as_number != NULL &&
v->ob_type->tp_as_number->nb_nonzero != NULL)
res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
else if (v->ob_type->tp_as_mapping != NULL &&
v->ob_type->tp_as_mapping->mp_length != NULL)
res = (*v->ob_type->tp_as_mapping->mp_length)(v);
else if (v->ob_type->tp_as_sequence != NULL &&
v->ob_type->tp_as_sequence->sq_length != NULL)
res = (*v->ob_type->tp_as_sequence->sq_length)(v);
else
return 1;
/* if it is negative, it should be either -1 or -2 */
return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
}
API函数,在2.7.2中看起来像这样:
{{1}}
答案 1 :(得分:1)
如果一个类既没有定义 len ()也没有定义非零(),那么 实例被认为是真实的。
None
的计算结果为false,因为它是specified to do so的内置类型。正如您所说,您未在__len__()
上定义__nonzero__()
或Ellipsis
。如果您希望它评估为false,
class Ellipsis(...):
#...
def __nonzero__(self):
return False
# or
def __len__(self):
return 0