回到前面的例子,你应该明白下面的代码:
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
如果在参数列表中检测到错误,它将返回 NULL (该值是返回对象指针的函数的错误提示),这取决于 PyArg_ParseTuple() 设置的异常。 在其他情况下参数的字符串值会被拷贝到局部变量 command。 这是一个指针赋值并且你不应该修改它所指向的字符串 (因此在标准 C 中,变量 command 应当被正确地声明为 const char *command)。
下一个语句使用UNIX系统函数 system() ,传递给他的参数是刚才从 PyArg_ParseTuple() 取出的:
sts = system(command);
我们的 spam.system() 函数必须以 Python 对象的形式返回 sts 的值。 这是通过使用函数 PyLong_FromLong() 完成的。
return PyLong_FromLong(sts);
在这种情况下,会返回一个整数对象,(这个对象会在Python堆里面管理)。
如果你有一个不返回有用参数的 C 函数(即返回 void 的函数),则对应的 Python 函数必须返回 None。 你必须使用这种写法(它是通过 Py_RETURN_NONE 宏来实现的)
Py_INCREF(Py_None);
return Py_None;
Py_None 是特殊 Python 对象 None 所对应的 C 名称。 它是一个真正的 Python 对象而不是 NULL 指针,如我们所见,后者在大多数上下文中都意味着“错误”。 |