0

我有一个用 C 语言编写的 Python 模块,其中暴露了许多函数。其中之一具有以下 Python 定义:

def SetPowerSupply(voltage, current, supply):

其中电压 = 浮动,电流 = 浮动,电源 = int。在 C 方面,我有这个:

float voltage, current;
int supply;

if (!PyArg_ParseTuple(args, "ffi", &voltage, &current, &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 提供的线索。

4

1 回答 1

0

One of your other functions is failing to return None when appropriate, and you're catching this error message by accident.

于 2012-07-13T17:12:37.540 回答