【发布时间】:2017-10-01 16:19:32
【问题描述】:
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 */
};
有些拥有它(例如1、2),而有些则没有(例如:1、2)。当你声明一个没有参数的方法时,有一个参数似乎没有意义。
鉴于“未使用”这个名字,它似乎曾经有过某种意义,但我不知道是什么意思。我尝试使用“git blame”并阅读了一些相关问题,但找不到关于这个“未使用”论点的任何内容。我还认为它可能与 sys.getsizeof 的“默认”参数有关,但这并没有传递给方法 - 方法知道给出的默认值有什么意义......
我对此很感兴趣:争论的目的是什么(以及当它变得过时时为什么不删除它)。
【问题讨论】:
-
我还不知道所有细节(我现在没有时间),但是没有
*unused的两个版本是Argument Clinic 实现。这几乎可以肯定是重要的。生成的代码会忽略额外的参数。
标签: python arguments cpython python-internals