[capi-sig] Getting Numbers in C

Hrvoje Niksic hniksic at xemacs.org
Sat Jul 21 01:07:57 CEST 2007


Campbell Barton <cbarton at metavr.com> writes:

> 		pyfloat = PyNumber_Float(value);

It might be a good idea to return -1 immediately if this returns
NULL.  That way you prevent clobbering the real exception with an
"invalid argument" exception returned by PyFloat_AsDouble.

If PyNumber_Float succeeds, but pyfloat turns out not to be float,
then the invalid argument exception is perfectly fine.

> However Im wondering if this is advisable, with PyErr_Occurred() its
> possible that some other part of the API (even a totaly separate
> API) sets the error string but dosnt return an error value. - Any
> suggestions?

Requiring the caller to check for PyErr_Occurred seems like bad style,
but I'm not sure that it's an actual problem, as long as it's clearly
documented.

As far as I know, no part of the API is allowed to set the error
string and not return an error value because that breaks other parts
of Python.  Consider this function:

static PyObject *
test()
{
  PyErr_SetString(PyExc_TypeError, "test");
  Py_INCREF(Py_None);
  return Py_None;
}

Calling it subtly breaks Python:

>>> import foo
>>> foo.test()
>>> import sys
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test

The exception lingered until the first function that relies on
PyErr_Occurred() to test for an exception, in this case PyImport_*.


More information about the capi-sig mailing list