gpt4 book ai didi

python - __next__ 和 __str__ 是否由等效的 next 和 str 函数在内部调用?

转载 作者:行者123 更新时间:2023-11-28 21:47:17 24 4
gpt4 key购买 nike

来自 Learning python 书第 5 版:

Page 421, footnote2:

Technically speaking, the for loop calls the internal equivalent of I.__next__, instead of the next(I) used here, though there is rarely any difference between the two. Your manual iterations can generally use either call scheme.

这到底是什么意思?这是否意味着 I.__next__ 由 C 函数而不是 for 循环或任何内置迭代上下文中的 str 内置函数调用?

Page 914:

__str__ is tried first for the print operation and the str built-in function (the internal equivalent of which print runs). It generally should return a user-friendly display.

除书本外,Python 是否如我从书中所理解的那样在内部使用 C 函数调用 __str____next__

最佳答案

Python C 实现使用与 Python 函数本质上相同的 C 函数,因为 Python 函数像 str()next() 通常是 C 函数的薄包装器。

然后这些 C 函数负责调用正确的钩子(Hook);这可能是钩子(Hook)的 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 int 对象。

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() .

关于python - __next__ 和 __str__ 是否由等效的 next 和 str 函数在内部调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36724262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com