2012-01-04 79 views
4

我不明白如何EllipsisNone通過bool()不同的處理,當兩個似乎是相同的真理測試的相關屬性方面。Python的布爾(省略號)和布爾(無)

>>> 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__

回答

8

bool(x)True如果x是沒有的,你提到的返回False魔術方法之一的對象。這就是爲什麼Ellipsis評估爲True

Nonebool()special-cased並使其返回False

詳情:

bool()使用PyObject_IsTrue() API函數2.7.2看起來是這樣的:

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); 
} 
+1

+1遵守歐比旺的永恆格言:「閱讀來源,盧克」。另請參見[關於真值測試的Python文檔](http://docs.python.org/py3k/library/stdtypes.html#truth-value-testing) – srgerg 2012-01-04 01:02:49

+0

@wim我的本地機器上有Python源代碼所以我只是通過搜索。我沒有使用ipython,所以我不知道它是否可以搜索C源代碼。 – yak 2012-01-04 01:16:11

+0

@srgerg謝謝。我已經添加了答案的鏈接。 – yak 2012-01-04 01:17:11

1

Python data model

如果一個類定義既不LEN()或否nzero(),它的所有 實例都被認爲是真實的。

None計算結果爲假,因爲它是一個內置的是specified to do so類型。如您所述,您沒有在Ellipsis上定義__len__()__nonzero__()。如果你想要它評估爲假,

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

    # or 
    def __len__(self): 
     return 0