内置“in”op的Python源代码

2024-09-24 00:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在(C)Python源代码中找到内置in运算符的实现。我搜索了内置函数源代码bltinmodule.c,但找不到这个运算符的实现。在哪里可以找到这个实现?在

我的目标是通过扩展这个搜索的不同C实现来改进Python中的子字符串搜索,尽管我不确定Python是否已经使用了我的想法。在


Tags: 函数字符串in目标源代码运算符内置bltinmodule
1条回答
网友
1楼 · 发布于 2024-09-24 00:29:16

要找到anypython操作符的实现,首先使用^{} function找出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求值循环中是如何处理的:

^{pr2}$

cmp_outcome()defined in the same filein运算符是其中一个开关:

case PyCmp_IN:
    res = PySequence_Contains(w, v);
    if (res < 0)
         return NULL;
    break;

一个快速grep显示了PySequence_ContainsObjects/abstract.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);
}

因此,PySequence_Contains因此对Python C对象使用^{} slot on the Sequence object structure或迭代搜索。在

对于python3unicode字符串对象,这个槽被实现为^{} in Objects/unicodeobject.c,在python2中,您还需要检查^{} in Objects/stringobject.c。基本上只要grep for sq_contains在Objects/subdirectory中针对不同Python类型的各种实现。在

对于泛型python对象,有趣的是,Objects/typeobject.c将这一点推迟到自定义类上的__contains__方法,如果这样定义的话。在

相关问题 更多 >