簡體   English   中英

內置“in”運算符的Python源代碼

[英]Python source code for built-in “in” operator

我想找到的執行內置in中(C)Python源代碼運營商。 我在內置函數源代碼bltinmodule.c中搜索過 ,但是找不到這個運算符的實現。 我在哪里可以找到這個實現?

我的目標是通過擴展此搜索的不同C實現來改進Python中的子字符串搜索,盡管我不確定Python是否已經使用了我的想法。

要查找任何 python運算符的實現,首先使用dis.dis函數找出Python為其生成的字節碼:

>>> 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/ceval.c的Python評估循環中跟蹤如何處理此操作碼:

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向我們展示了在Objects / abstract.c中定義PySequence_Contains位置:

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

因此,對於Python C對象, PySequence_Contains使用Sequence對象結構上sq_contains或否則使用迭代搜索。

對於Python 3的Unicode字符串對象,該插槽被實現為PyUnicode_Contains的對象/ unicodeobject.c ,在Python 2,你也想看看string_contains在對象/ stringobject.c 基本上只是grep for Objects /子目錄中的sq_contains ,用於不同Python類型的各種實現。

對於通用python對象,有趣的是注意到Objects / typeobject.c將此推遲到自定義類的__contains__方法,如果這樣定義的話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM