- double val = (PyFloat_Check(obj)) ? PyFloat_AsDouble(obj) :
-#if HAVE_LONG_LONG
- ((PyInt_Check(obj)) ? PyInt_AsLong(obj) : PyLong_AsLongLong(obj));
-#else
- ((PyInt_Check(obj)) ? PyInt_AsLong(obj) : PyLong_AsLong(obj));
-#endif
- if (PyErr_Occurred()) {
- PyErr_Clear();
- PyErr_SetString(PyExc_TypeError, "a double is expected");
- }
- return val;
+ if (PyNumber_Check(obj))
+ return PyFloat_AsDouble(obj);
+ else {
+ PyObject* errmsg = PyString_FromFormat("Expected number, got %s",
+ obj->ob_type->tp_name);
+ PyErr_SetObject(PyExc_TypeError, errmsg);
+ Py_DECREF(errmsg);
+ return 0;
+ }