1.3 回到例子
根据是否由PyArg_ParseTuple()函数设置了异常,如果在参数列表中检测到错误(异常被设置), 则函数返回NULL(函数返回对象指针的错误标识)。否则,参数的字符串值已经被拷贝到本地变量command中了。这是一个分配的指针,你不应修改指针指向的字符串 (就象在标准C中,变量command应该正确地声明为"const char *command ")。
Py_None是Python空对象的C名称。这是一个典型的Python对象而不只是一个NULL 指针,正如我们已经看到的,在大多数情况下,Py_None表示错误。
回到我们的例子函数中,现在,你应该能够理解下面这些语句:
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;根据是否由PyArg_ParseTuple()函数设置了异常,如果在参数列表中检测到错误(异常被设置), 则函数返回NULL(函数返回对象指针的错误标识)。否则,参数的字符串值已经被拷贝到本地变量command中了。这是一个分配的指针,你不应修改指针指向的字符串 (就象在标准C中,变量command应该正确地声明为"const char *command ")。
下面的语句调用了UNIX函数system(),传递给函数我们从PyArg_ParseTuple() 得到的字符串
sts = system(command);我们的spam.system() 函数必须把sts的值作为Python对象返回。这可以通过Py_BuildValue()函数实现, 此函数有点象PyArg_ParseTuple()函数的反函数,这个函数带一个格式化字符串和任意个C值,并且返回一个Python对象。Py_BuildValue() 函数的详细信息后面给出。
return Py_BuildValue("i", sts);在本例中,它返回一个整数对象(的确,即使整数也是Python堆上的对象); 如果你有一个C函数返回无用参数(即函数返回void),相应的Python函数必须返回None 。你应习惯这么做(由Py_RETURN_NONE宏实现):
Py_INCREF(Py_None);
return Py_None;
Py_None是Python空对象的C名称。这是一个典型的Python对象而不只是一个NULL 指针,正如我们已经看到的,在大多数情况下,Py_None表示错误。
本文深入探讨了Python C-API中的PyArg_ParseTuple与Py_BuildValue函数的使用方法,解释了如何通过这两个函数处理函数参数并返回Python对象。

被折叠的 条评论
为什么被折叠?



