内置 "in"算子的Python源码

标签 python c string cpython python-internals

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

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

最佳答案

要找到任何 python 操作符的实现,首先找出Python 为它生成的字节码,使用dis.dis function :

>>> 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()defined in the same filein 运算符是开关之一:

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

快速 grep 向我们展示了 PySequence_Contains 的定义位置,在 Objects/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 因此使用 sq_contains slot on the Sequence object structure或以其他方式迭代搜索 Python C 对象。

对于 Python 3 Unicode 字符串对象,此插槽实现为 PyUnicode_Contains in Objects/unicodeobject.c ,在 Python 2 中你还想查看 string_contains in Objects/stringobject.c .基本上只是 grep for sq_contains 在 Objects/子目录中,用于不同 Python 类型的各种实现。

对于通用 python 对象,有趣的是要注意 Objects/typeobject.c将其推迟到自定义类上的 __contains__ 方法(如果已定义)。

关于内置 "in"算子的Python源码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244074/

相关文章:

python - 使用 strip() 清理字符串

python - 使用 python(pymongo) 编辑 mongodb 中的嵌入文档

ios - componentsSeparatedByString 不能快速工作

c - 如何正确初始化一个字符串

c - C中的for循环内值变成0

javascript - 对字符串和 if 测试的简单 JavaScript 查询

python - 未定义的名称 'ndimage' 即使我已经使用 import scipy.ndimage 和 loop 导入了它

python - Bokeh + 交互式小部件 + PythonAnywhere

c - 语法不清楚指针和矩阵

Android Studio CMakeLists错误: undefined reference to