"参数,CPython 中的一些 __sizeof__ 方法?-6ren"> "参数,CPython 中的一些 __sizeof__ 方法?-CPython 源代码中的几个 C 类型有一个 __sizeof__ 方法,因此它们可以为带有 sys.getsizeof 的实例提供大致准确的大小(以字节为单位)。 这些方法被声明为 METH_NO-6ren">
gpt4 book ai didi

python - 什么是 "void* "参数,CPython 中的一些 __sizeof__ 方法?

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:05 26 4
gpt4 key购买 nike

CPython 源代码中的几个 C 类型有一个 __sizeof__ 方法,因此它们可以为带有 sys.getsizeof 的实例提供大致准确的大小(以字节为单位)。

这些方法被声明为 METH_NOARG 但有些方法确实有一个 void* whatever 参数,例如 itertools.product.__sizeof__:

static PyObject *
product_sizeof(productobject *lz, void *unused)
{
Py_ssize_t res;

res = _PyObject_SIZE(Py_TYPE(lz));
res += PyTuple_GET_SIZE(lz->pools) * sizeof(Py_ssize_t);
return PyLong_FromSsize_t(res);
}

static PyMethodDef product_methods[] = {
/* ... */
{"__sizeof__", (PyCFunction)product_sizeof, METH_NOARGS, sizeof_doc},
{NULL, NULL} /* sentinel */
};

有些有(例如 12 ),而有些则没有(例如: 12 )。当您将其声明为不带参数的方法时,带有参数似乎没有意义。

鉴于“未使用”这个名称,它似乎曾经有过某种意义,但我无法弄清楚是什么意思。我试过使用“git blame”并阅读了一些相关问题,但找不到关于这个“未使用”论点的任何内容。我还认为它可能与 sys.getsizeof 的“默认”参数有关,但它没有传递给方法 - 方法知道给出的默认值有什么意义.. .

我对此很感兴趣:争论的目的是什么(以及当它变得过时时为什么不将其删除)。

最佳答案

没有只采用单个参数的特定类型的函数。 PyCFunction s 总是取两个作为它的文档状态:

Type of the functions used to implement most Python callables in C. Functions of this type take two PyObject* parameters and return one such value.

METH_NOARGS case 并不意味着该函数只有一个参数,而是意味着第二个参数将始终为 NULL:

The first parameter is typically named self and will hold a reference to the module or object instance. In all cases the second parameter will be NULL.

你也可以直接在call.c:_PyMethodDef_RawFastCallKeywords中看到这个调用位置:

case METH_NOARGS:
// After snipping checks away
result = (*meth) (self, NULL);

对此有很多讨论,请参阅 here , herehere对于其中一些。


对于只有一个参数的版本,正如 Martijn 指出的那样,这些版本使用参数诊所来隐藏它。

关于python - 什么是 "void* <unused>"参数,CPython 中的一些 __sizeof__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46514343/

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