Исходный код Python для встроенного оператора" in"

Я пытаюсь найти реализацию встроенный in оператор в исходном коде Python (C). Я искал во встроенных функциях исходный код,bltinmodule.c, но не может найти реализации этого оператора. Где я могу найти эту реализацию?

моя цель-улучшить поиск подстрок в Python, расширив различные реализации этого поиска на C, хотя я не уверен, что Python уже использует мою идею.

1 ответов


чтобы найти реализацию любой оператор python, сначала узнайте, какой байт-код Python генерирует для него, используя dis.dis функции:

>>> dis.dis("'0' in ()")
  1           0 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 определена в объекты/реферат.c:

int
PySequence_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);
}

использует sq_contains слот на структуре объекта последовательности или итеративный поиск в противном случае, для объектов Python в C.

для Python 3 строковых объектов Unicode этот слот реализован как PyUnicode_Contains в объектах / unicodeobject.c, в Python 2 вы также хотите, чтобы проверить string_contains в объектах / stringobject.c. В основном просто grep для sq_contains в подкаталоге Objects / для различных реализаций различными типами Python.

для общих объектов python интересно отметить, что объекты/typeobject.c переносит это на __contains__ метод для пользовательских классов, если это определено.