किसी भी अजगर ऑपरेटर के कार्यान्वयन को खोजने के लिए, पहले यह पता लगाने क्या बाईटकोड अजगर इसके लिए उत्पन्न करता है, dis.dis
function का उपयोग कर:
>>> def inop():
... '0' in []
...
>>> dis.dis(inop)
2 0 LOAD_CONST 1 ('0')
3 LOAD_CONST 2 (())
6 COMPARE_OP 6 (in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
in
ऑपरेटर एक COMPARE_OP
बाइट कोड हो जाता है। अब आप Python/ceval.c
में मूल्यांकन पाश में इस ट्रेस कर सकते हैं:
TARGET(COMPARE_OP)
w = POP();
v = TOP();
x = cmp_outcome(oparg, v, w);
Py_DECREF(v);
Py_DECREF(w);
SET_TOP(x);
if (x == NULL) break;
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;
एक त्वरित ग्रेप हमें जहां से पता चलता 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
इस प्रकार 01 का उपयोग करता है पाइथन सी ऑब्जेक्ट्स के लिएया अन्यथा एक पुनरावृत्ति खोज।
पायथन 3 यूनिकोड स्ट्रिंग ऑब्जेक्ट्स के लिए, यह स्लॉट PyUnicode_Contains
in Objects/unicodeobject.c के रूप में लागू किया गया है, पायथन 2 में आप string_contains
in Objects/stringobject.c भी देखना चाहते हैं। मूल रूप से विभिन्न पायथन प्रकारों के विभिन्न कार्यान्वयन के लिए ऑब्जेक्ट्स/उपनिर्देशिका में sq_contains
के लिए grep।
जेनेरिक पायथन ऑब्जेक्ट्स के लिए, यह ध्यान रखना दिलचस्प है कि Objects/typeobject.c कस्टम वर्गों पर __contains__
विधि को परिभाषित करता है, यदि ऐसा परिभाषित किया गया है।
आपके उत्तर के लिए धन्यवाद – Michael
@ माइकल: कृपया इस उत्तर को स्वीकार करने पर विचार करें क्योंकि यह मेरे से अधिक उपयोगी है। – georg
@ thg435: आप सही हैं, +1 उत्तर स्वीकार कर लिया गया है – Michael