CPython中是如何判断“真”的
source link: https://www.hongweipeng.com/index.php/archives/2024/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
GsqpV3POOmNifLPt8BlXJ2rnYyYmuny9QBkqvyXlzQEVpbSziTunfjA4lDF9znlR7ATcnEQnfeLVMVw8wBaEArh9XYZOuSuKtJeNzoyDsrycLJK0yR+c4v3cmLlrEpcF4N1WT4maaN6ynUST0FnEpmzmx0rVYL7Z44Axzy9x0i+CuLWLas0CYYBEzBc1hbtn4d3U7wyPembcBL8MamBpvcnw+oZlsGkA5ATEgDNn6Hmae8EiG9iLrd4Iw0T0vLiVlP7Kdu2/raJ2rE4GmSIt2qBV14MSWtX2k1MEnzVmLKNsnsEx1wc0owc0FW7SJqJf
>>> def fun():
... if v:
... pass
...
>>> import dis
>>> dis.dis(fun)
2 0 LOAD_GLOBAL 0 (v)
2 POP_JUMP_IF_FALSE 4
3 >> 4 LOAD_CONST 0 (None)
6 RETURN_VALUE
>>>
“真” 是怎么定义的
Ci4DwwrqELeZMyW6lTxo43hbBdtSbnpz21qR2seiW72vlLXbTiaMc44BKJiwAzmOjMN/puYgjMWNlIS1Zr2yGw==
bkT7LhzYwKlRZSazi+vJzRLVv3zZnGiJwVGHixsM8ULD1VqF80LFx6ZWajL1M7kq16lpCaKkWT2tPNIo3+1ZODc/QA9HSOr/vBraIgsBjsQpS4Twql5IfknzU1k6ExmQ/ZuVPcsuUqfXqf4U/l4dHw==
eaIwLMNm6Iv0eNCCAP4gYrNhoXBPIwSiR6LraUR/PD+pqT5vIFrugyApKHK+lAI7h8Ae4AyJYLgfAHy6BZ0IaL2JMs7IYz1XBVBtECvyBJi9SCWwcLcmfCtABf10TIToB4dhq78Y9H7+93mSkHtjgr42bNgpoFFbewGLMQMsf7OqxRhTShjXfz8DmCcd5JpyVO5iCJoOOCYHfRH+54v+A5IWGtwQG39ZD99cJ+LM6BmRuX4y8d4WbeEmXN5TNBwI
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_bool != NULL)
res = (*v->ob_type->tp_as_number->nb_bool)(v); // 调用对象的 __bool__
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); // 调用对象的 __len__
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);// 调用对象的 __len__
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);
}
Ii8pI0rp+U6fb1+PQ+0VjKW74LsM8mbRo1cQ16AOcDg=
- 如果 v 是
True
,那么为True
; - 如果 v 是
False
,那么为False
; - 如果 v 是
None
,那么为False
; - 如果 v 定义了魔术方法
__bool__
,则调用它; - 如果 v 是映射容器,那么调用
__len__
方法,空容器视为False
; - 如果 v 是序列对象,那么调用
__len__
方法,空序列视为False
; - 以上都不是,那么为
True
。
MaRoXlaXj1w5JRDamynPplOfwnWcDlLPSV3njFJn/PvPKgxnOssfkxvA0W3hKZNz5u+wg9AzgHDal5EHfgIqdIrguBURmGUhtz15+F6mbuGoWL/225kN3dzaw7+zwJ2Iywybkz41LL3uHYydK7KTSxT4EyBkjvePwkhm9+JJ4K5vrey/xxwimzmfuMQ5s+wgO2XOykGUGbpyfa7NJsvAgO5ZKl44GoncWl9TvRNBomYwFW2Z46yR+kpdA7571TI8PQ2brd8j+gTTyVxC0qP3HHBfwvs7QptUE4M4Ruonqn0etxGuwRpD+7P0p3hh5pq4BmzKITd8pTcWqU0sPMMwiNNUFXHjb09FxblmRIq2wa8RiKQElphM2APtx82W+FjyHcywLn4Ow29X013N37kj1TI0y0VDsCIXyvbs8hXPqszYEnCiSzewcVrAgmhS/eFQCpCRJLJmqTKnS8KbiYbGdCV2klhwl6FiJAxkvmQ9/kWy/zsOAiSVwKoBxOhUXmO+g+IIRmrdOabBuGtGrLxIcw==
typedef Py_ssize_t (*lenfunc)(PyObject *);
bkT7LhzYwKlRZSazi+vJzRLVv3zZnGiJwVGHixsM8ULD1VqF80LFx6ZWajL1M7kqUzXGVLfMkb0MBUQr4PwYA1qeVxJLNVGgnPVjUl07ukwVRUzdMu+mPavdg4NzGqKFwsgL+vKQTwR7+Cfyxp7Fgw==
Python实现
ULcrtMz2/qwjE1aMC6Qr6UM+S4DGExPEiaoqkcoLkAMaEuEvWX6m0kjQwksCzRoWTlME4nNp0OcEcVupuNm/vUgxzV+J7/i959frBRswNa/BgvbuGXnjitfEif+scRvVWPX93pkiJczTYucj44cWbA==
def truth(obj: Any, /) -> bool:
if obj is True:
return True
elif obj is False:
return False
elif obj is None:
return False
elif hasattr(obj, '__bool__'):
return obj.__bool__()
elif hasattr(obj, '__len__'):
return obj.__len__()
return True
not
的处理方式
1Io+2NONxhoP26ArgZ15F9tYF7KpA1kvLgOzm5PK0bHEoi16JKwhUs0hi9muwIF9rFIqrosDsmGKpWb10MKX9FUtO35WGpLgF2st4imEnDL/msM5aVVLTR4AJaT8GQtEE87Fem7D2gWohjLi+RYv6xaRo2J1tc9FhHp/jjY5SWJCRqZmvS2oppvS6fBTYHd/
>>> def fun():
... if not v:
... pass
...
>>> import dis
>>> dis.dis(fun)
2 0 LOAD_GLOBAL 0 (v)
2 POP_JUMP_IF_TRUE 4
3 >> 4 LOAD_CONST 0 (None)
6 RETURN_VALUE
>>>
bkT7LhzYwKlRZSazi+vJzRLVv3zZnGiJwVGHixsM8ULD1VqF80LFx6ZWajL1M7kqbhDJYbD6m0cqc6+3mr56uX7wX7jBF1AE7G+vSuZT7DNz0YQ4KiO1SxrP1DKbpjgVIDKhgA0Z/vGY0x43uvUayQ==
qy4b5QzaMociGeksTtYtKGk8P2CUQgRFCGbjI2pu2q0l2QoFY7i/EO8/pfJS1Nb94tDl8bNs6FVTX+Hq9MmA2Q/fdYVw+NmU56qj6vxpUOE=
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK