{site_name}

{site_name}

🌜 搜索

Python Argument Clinic 是 CPython 中的一个工具,

Python 𝄐 0
arguments python,python argument of type,python argument list too long,python main args,python中arial,python中arrary
Python Argument Clinic 是 CPython 中的一个工具,用于自动生成 PyArg_ParseTuple() 和 Py_BuildValue() 函数调用的 C 代码。这些函数用于将 Python 对象转换为 C 类型和将 C 类型转换为 Python 对象。

使用 Argument Clinic 可以方便地编写 C 扩展模块,减少手写 C 代码的工作量,并提高代码的可读性和可维护性。

下面是一个简单的例子,演示如何在 CPython 的源代码中使用 Argument Clinic 来定义一个 C 函数:

c
static PyObject *example_func(PyObject *self, PyObject *args, PyObject *kwargs) {
static char *kwlist[] = {"name", "age", NULL};
char *name;
int age;

if (!PyArg_ParseTupleAndKeywords(args, kwargs, "si", kwlist, &name, &age)) {
return NULL;
}

printf("Hello, %s! You are %d years old.\n", name, age);

Py_RETURN_NONE;
}

/*[clinic input]
example_func
name: str
The name to print.
age: int
The age to print.
[clinic start generated code]*/

PyDoc_STRVAR(example_func__doc__,
"example_func($module, /, name:str, age:int)\n"
"--\n"
"\n"
"The documentation for example_func goes here."
);

#define EXAMPLE_FUNC_METHODDEF \
{"example_func", (PyCFunction)example_func, METH_VARARGS|METH_KEYWORDS, example_func__doc__},

static struct PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT,
"example",
"This is a module docstring.",
-1,
NULL,
NULL,
NULL,
NULL,
NULL
};

PyMODINIT_FUNC PyInit_example(void)
{
PyObject *module = PyModule_Create(&moduledef);
if (module == NULL) {
return NULL;
}

PyModule_AddFunctions(module, example_funcs);

return module;
}


这个例子定义了一个名为 example_func 的 C 函数,它接受两个参数:一个字符串和一个整数。在函数体内,我们使用 PyArg_ParseTupleAndKeywords() 函数解析传入的参数,并打印一条消息。

代码中的 [clinic input] 和 [clinic start generated code] 标记是 Argument Clinic 自动生成的代码。它们表示 Argument Clinic 生成的代码块的开始和结束。在输入部分,我们定义了函数参数的名称和类型。在生成的代码部分,Argument Clinic 自动创建了一个文档字符串和函数签名,以及处理参数转换的代码。

最后,我们需要将模块函数添加到模块中,并返回模块对象。