2024-09-24 00:29:16 发布
网友
我试图在(C)Python源代码中找到内置in运算符的实现。我搜索了内置函数源代码bltinmodule.c,但找不到这个运算符的实现。在哪里可以找到这个实现?在
in
我的目标是通过扩展这个搜索的不同C实现来改进Python中的子字符串搜索,尽管我不确定Python是否已经使用了我的想法。在
要找到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求值循环中是如何处理的:
COMPARE_OP
cmp_outcome()是defined in the same file,in运算符是其中一个开关:
cmp_outcome()
case PyCmp_IN: res = PySequence_Contains(w, v); if (res < 0) return NULL; break;
一个快速grep显示了PySequence_Contains在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); }
因此,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类型的各种实现。在
sq_contains
对于泛型python对象,有趣的是,Objects/typeobject.c将这一点推迟到自定义类上的__contains__方法,如果这样定义的话。在
__contains__
要找到anypython操作符的实现,首先使用^{} function 找出python为其生成的字节码:
} 中的Python求值循环中是如何处理的:
^{pr2}$in
运算符变成COMPARE_OP
字节码。现在您可以跟踪此操作码在^{cmp_outcome()
是defined in the same file,in
运算符是其中一个开关:一个快速grep显示了
PySequence_Contains
在Objects/abstract.c中的定义:因此,} slot on the Sequence object structure 或迭代搜索。在
PySequence_Contains
因此对Python C对象使用^{对于python3unicode字符串对象,这个槽被实现为^{} in Objects/unicodeobject.c ,在python2中,您还需要检查^{} in Objects/stringobject.c 。基本上只要grep for
sq_contains
在Objects/subdirectory中针对不同Python类型的各种实现。在对于泛型python对象,有趣的是,Objects/typeobject.c将这一点推迟到自定义类上的
__contains__
方法,如果这样定义的话。在相关问题 更多 >
编程相关推荐