Python bool(省略号)和bool(无)

时间:2012-01-04 00:45:00

标签: python python-2.7 boolean

我不明白EllipsisNonebool()的处理方式有何不同,当两者在真值测试的相关属性方面看起来完全相同时。

>>> 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
  1. 我还缺少其他用于真相测试的东西吗?

  2. 是否有任何其他对象(None除外)评估为False且未实现__len____nonzero__

2 个答案:

答案 0 :(得分:8)

bool(x) True x如果False是一个对象而没有您提到的返回Ellipsis的魔术方法之一。这就是True评估为None的原因。

bool()中{p> Falsespecial-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)

来自Python data model

  

如果一个类既没有定义 len ()也没有定义非零(),那么   实例被认为是真实的。

None的计算结果为false,因为它是specified to do so的内置类型。正如您所说,您未在__len__()上定义__nonzero__()Ellipsis。如果您希望它评估为false,

class Ellipsis(...):
  #...
  def __nonzero__(self):
      return False

  # or
  def __len__(self):
      return 0