要找到 任何
python运算符的实现,请首先使用
dis.dis函数找出Python为其生成的字节码:
>>> dis.dis("'0' in ()") 10 LOAD_ConST 0 ('0') 2 LOAD_ConST 1 (()) 4 COMPARE_OP 6 (in) 6 RETURN_VALUE该
in运算符成为
COMPARE_OP字节码。现在,您可以在Python评估循环中跟踪如何处理此操作码
Python/ceval.c:
TARGET(COMPARE_OP) PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = cmp_outcome(oparg, left, right); Py_DECREF(left); Py_DECREF(right); SET_TOP(res); if (res == NULL) goto error; PREDICT(POP_JUMP_IF_FALSE); PREDICT(POP_JUMP_IF_TRUE); DISPATCH();
cmp_outcome()是在相同的文件中定义,并且
in操作者是开关中的一个:
case PyCmp_IN: res = PySequence_Contains(w, v); if (res < 0) return NULL; break;
快速grep向我们显示了
PySequence_Contains在Objects /
abstract.c中定义的位置:
intPySequence_Contains(PyObject *seq, PyObject *ob){ Py_ssize_t result; PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; if (sqm != NULL && sqm->sq_contains != NULL) return (*sqm->sq_contains)(seq, ob); result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS); return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);}PySequence_Contains因此,对于Python
C对象,请使用
sq_containsSequence对象结构上的插槽或其他方式进行迭代搜索。
对于Python 3 Unipre字符串对象,此插槽的实现方式
PyUnipre_Contains与Objects /
unipreobject.c相同,在Python
2中,您还想
string_contains在Objects /
stringobject.c中检出。基本上
sq_contains,对于不同Python类型的各种实现,仅在Objects
/子目录中使用grep即可。
对于通用python对象,有趣的是注意到Objects /
typeobject.c将其推迟到
__contains__自定义类的方法(如果已定义)。



