2012-09-03 23 views
9

के लिए पायथन स्रोत कोड (सी) पायथन स्रोत कोड में अंतर्निहित in ऑपरेटर के कार्यान्वयन को खोजने का प्रयास कर रहा हूं। मैंने बिल्ट-इन फ़ंक्शंस स्रोत कोड, bltinmodule.c में खोज की है, लेकिन इस ऑपरेटर के कार्यान्वयन को नहीं मिला। मुझे यह कार्यान्वयन कहां मिल सकता है?अंतर्निहित "इन" ऑपरेटर

मेरा लक्ष्य इस खोज के विभिन्न सी कार्यान्वयन को विस्तारित करके पायथन में उप-स्ट्रिंग खोज को बेहतर बनाना है, हालांकि मुझे यकीन नहीं है कि पाइथन पहले से ही मेरे विचार का उपयोग कर रहा है या नहीं।

उत्तर

30

किसी भी अजगर ऑपरेटर के कार्यान्वयन को खोजने के लिए, पहले यह पता लगाने क्या बाईटकोड अजगर इसके लिए उत्पन्न करता है, 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__ विधि को परिभाषित करता है, यदि ऐसा परिभाषित किया गया है।

+0

आपके उत्तर के लिए धन्यवाद – Michael

+2

@ माइकल: कृपया इस उत्तर को स्वीकार करने पर विचार करें क्योंकि यह मेरे से अधिक उपयोगी है। – georg

+0

@ thg435: आप सही हैं, +1 उत्तर स्वीकार कर लिया गया है – Michael