[英]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.