我有一个用C语言编写的Python模块,其中暴露了许多功能。其中一个有Python定义:
def SetPowerSupply(voltage, current, supply):
其中voltage = float,current = float和supply = int。在C方面,我有这个:
float voltage, current;
int supply;
if (!PyArg_ParseTuple(args, "ffi", &voltage, ¤t, &supply))
{
// Failed to parse
// ...
}
我的一个脚本编写者有一个脚本,其中此函数无法解析参数,抱怨期望一个整数。据我所知,一个整数实际上是传入的,因为如果在错误分支中我这样做:
PyObject *num = PyNumber_Float(PyTuple_GetItem(args, 0));
voltage = PyFloat_AsDouble(num);
Py_XDECREF(num);
num = PyNumber_Float(PyTuple_GetItem(args, 1));
current = PyFloat_AsDouble(num);
Py_XDECREF(num);
num = PyNumber_Int(PyTuple_GetItem(args, 2));
supply = PyLong_AsLong(num);
Py_XDECREF(num);
...然后一切都按预期工作。通过此模块运行的其他脚本不会出现此行为,我看不出任何差异。他们俩都称这个函数是一样的:
SetPowerSupply(37.5, 0.5, 1)
SetPowerSupply(0, 0, 1)
在违规脚本中,我可以这样做:
任何想法???
谢谢。
编辑:
问题是由另一个在此函数之前调用多个函数的函数引起的。那是:
if(!PyArg_ParseTuple(args, "s|siss", &board, &component, &pin, &colorStr, &msg))
{
// Parsing the pin as an int failed, try as a string
if(!PyArg_ParseTuple(args, "s|ssss", &board, &component, &sPin, &colorStr, &msg))
{
// ...
这样做的目的是基本上重载第三个参数以接受字符串或数值。当有人向其提供字符串时,失败的解析中的Python错误从未被清除。解决该问题的更新代码如下。
if(!PyArg_ParseTuple(args, "s|siss", &board, &component, &pin, &colorStr, &msg))
{
PyErr_Clear();
// Parsing the pin as an int failed, try as a string
if(!PyArg_ParseTuple(args, "s|ssss", &board, &component, &sPin, &colorStr, &msg))
{
// ...
非常感谢Ignacio的线索。
答案 0 :(得分:0)
您的其他功能之一是在适当的时候无法返回None
,并且您意外捕获此错误消息。