O (object) [PyObject *]
将 Python 对象(未经任何转换)存储到一个 C 对象指针中。 这样 C 程序就能接收到实际传递的对象。 对象的新 strong reference 不会被创建(即其引用计数不会增加)。 存储的指针将不为 NULL。
O! (object) [typeobject, PyObject *]
将一个 Python 对象存入一个 C 对象指针。 这类似于 O,但是接受两个 C 参数:第一个是 Python 类型对象的地址,第二个是存储对象指针的 C 变量 (类型为 PyObject*)。 如果 Python 对象不具有所要求的类型,则会引发 TypeError。
O& (object) [converter, anything]
通过 converter 函数将 Python 对象转换为 C 变量。这需要两个参数:第一个是函数,第二个是 C 变量(任意类型)的地址,转换为 void*。转换器 函数依次调用如下:
status = converter(object, address);
其中 object 是待转换的 Python 对象而 address 为传给 PyArg_Parse* 函数的 void* 参数。 返回的 status 应当以 1 代表转换成功而以 0 代表转换失败。 当转换失败时,converter 函数应当引发异常并让 address 的内容保持未修改状态。
如果 converter 返回 Py_CLEANUP_SUPPORTED ,则如果参数解析最终失败,它可能会再次调用该函数,从而使转换器有机会释放已分配的任何内存。在第二个调用中,object 参数将为 NULL ;因此,该参数将为 NULL ;因此,该参数将为 NULL ,因此,该参数将为 NULL (如果值)为 NULL address 的值与原始呼叫中的值相同。
在 3.1 版本发生变更: Py_CLEANUP_SUPPORTED 被添加。
p (bool) [int]
测试传入的值是否为真(一个布尔判断)并且将结果转化为相对应的 C true/false 整型值。如果表达式为真置 1,假则置 0。它接受任何合法的 Python 值。参见 逻辑值检测 获取更多关于 Python 如何测试值为真的信息。
在 3.3 版本加入.
(items) (tuple) [matching-items]
对象必须是 Python 序列,它的长度是 items 中格式单元的数量。C 参数必须对应 items 中每一个独立的格式单元。序列中的格式单元可能有嵌套。
传递 "long" 整型 (取值超出平台的 LONG_MAX 限制的整形) 是可能的,然而不会进行适当的范围检测 --- 当接受字段太小而接收不到值时,最高有效比特位会被静默地截断 (实际上,该语义是继承自 C 的向下转换 --- 你的计数可能会发生变化)。
格式化字符串中还有一些其他的字符具有特殊的涵义。这些可能并不嵌套在圆括号中。它们是:
|
表明在 Python 参数列表中剩下的参数都是可选的。C 变量对应的可选参数需要初始化为默认值——当一个可选参数没有指定时, PyArg_ParseTuple() 不能访问相应的 C 变量(变量集)的内容。
$
PyArg_ParseTupleAndKeywords() only:表明在 Python 参数列表中剩下的参数都是强制关键字参数。当前,所有强制关键字参数都必须也是可选参数,所以格式化字符串中 | 必须一直在 $ 前面。
在 3.3 版本加入.
:
格式单元的列表结束标志;冒号后的字符串被用来作为错误消息中的函数名(PyArg_ParseTuple() 函数引发的“关联值”异常)。
;
格式单元的列表结束标志;分号后的字符串被用来作为错误消息取代默认的错误消息。 : 和 ; 相互排斥。
请注意提供给调用者的任何 Python 对象引用都是 借入 引用;不要释放它们(即不要递减它们的引用计数)!
传递给这些函数的附加参数必须是由格式化字符串确定的变量的地址;这些都是用来存储输入元组的值。有一些情况,如上面的格式单元列表中所描述的,这些参数作为输入值使用;在这种情况下,它们应该匹配指定的相应的格式单元。
为了让转换成功,arg 对象必须匹配格式并且格式必须被用尽。 当成功时,PyArg_Parse* 函数将返回真值,否则将返回假值并引发适当的异常。 当 PyArg_Parse* 函数由于某个格式单元转换出错而失败时,该格式单元及其后续格式单元对应的地址上的变量都将保持原样。 |