的Python C實現使用對基本上一回事Python的函數C的功能,在該像str()
和next()
Python的函數通常是圍繞C函數薄包裝。
這些C函數然後負責調用右鉤子;這可能是掛鉤的C版本(指向函數的結構中的插槽)或類中的Python函數。
現在,str()
和next()
都比這裏的包裝稍微多一些,因爲這些函數定義了額外的功能,需要更多的實現工作;例如,next()
採用定義默認值的第二個參數。
所以我以len()
爲例。該功能在builtin_len()
C function定義:
static PyObject *
builtin_len(PyObject *self, PyObject *v)
{
Py_ssize_t res;
res = PyObject_Size(v);
if (res < 0 && PyErr_Occurred())
return NULL;
return PyInt_FromSsize_t(res);
}
注意通話PyObject_Size()
;這就是C代碼用來獲取對象長度的原因。其餘的只是錯誤處理和生成一個Python對象。
PyObject_Size()
然後是implemented like this:
Py_ssize_t
PyObject_Size(PyObject *o)
{
PySequenceMethods *m;
if (o == NULL) {
null_error();
return -1;
}
m = o->ob_type->tp_as_sequence;
if (m && m->sq_length)
return m->sq_length(o);
return PyMapping_Size(o);
}
它需要一個PyObject
結構,發現從那裏ob_type
結構,其具有可選的tp_as_sequence
結構,其可以定義一個sq_length
函數指針。如果存在,則調用它來產生實際的長度。不同的類型可以定義這個函數,並且Python的實例可以使用特殊的C結構重定向回Python方法。
所有這些都表明,Python的內部實現使用了大量的抽象來實現對象,允許C定義的類型和Python類大致相同。如果您想深入瞭解,Python文檔包含full coverage of the C-API,其中包括dedicated tutorial。
盤旋迴原來的兩個功能的next()
內部的等效爲PyIter_Next()
,並str()
,如用於任意對象的字符串轉換,是PyObject_Str()
。
這是一個很好的解釋,不幸的是我不是C開發人員,但我喜歡深入內部。因此,我從你的解釋中得出結論:'str'和'next'確實是C函數,他們決定調用可以是C或Python函數的右鉤子。 – direprobs