From: herzog at online.de (Bernhard Herzog)
Date: 13 Apr 1999 00:02:04 +0200
Subject: extending questions
References: <371220AD.6C3B0B5@home.com> <ltqQ2.383$Ij2.44245@news.shore.net>
Message-ID: <m3k8vhh50j.fsf@greebo.nodomain.de>
Content-Length: 1694
X-UID: 1169                                                  

"Michael P. Reilly" <arcege at shore.net> writes:

> Jim Meier <fatjim at home.com> wrote:
> : Firstly, I'm looking for a quick and easy way for a PyCFunction to
> : accept as an argument either an integer or a floating point number, so
> : that the function can be called as
> 
> :   func(1,1,1)
> 
> : or as
> 
> :   func(0.5,0,2/3)
> 
> : because python doesn't seem to let me consider an integer as a float.
> : I've tried using some of the conversion functions in the abstract
> : numeric suite and the PyFloat_GetDouble (or some similar name), but with
> : no luck - it always returned -1 for me. Any ideas?
> 
> My best suggestion would be to use the PyInt_Check and PyFloat_check
> functions.
> 
>   PyObject *func(PyObject *self, PyObject *args)
>     { PyObject *arg1, *arg2, *arg3;
>       double a1, a2, a3;
> 
>       if (!PyArg_ParseTuple(args, "OOO", &arg1, &arg2, &arg3))
>         return NULL;
>       /* get the double from the first argument */
> #define py_to_double(a, var) \
>       if (PyInt_Check(a)) (var) = (double)PyInt_AS_LONG(a); \
>       else if (PyFloat_Check(a)) (var) = PyFloat_AS_DOUBLE(a); \
>       else { PyErr_SetString(PyExc_TypeError, "must supply a number"); \
>         return NULL; }
> 
>       py_to_double(arg1, a1);
>       py_to_double(arg2, a2);
>       py_to_double(arg3, a3);
> #undef py_to_double

Why not just

PyObject *
func(PyObject *self, PyObject *args)
{
	double a1, a2, a3;

	if (!PyArg_ParseTuple(args, "ddd", &a1, &a2, &a3))
		return NULL;


/* ... */
}


This should work for Python floats, int and longs.


-- 
Bernhard Herzog	  | Sketch, a python based drawing program
herzog at online.de  | http://www.online.de/home/sketch/




