[Python-Dev] getter/setter function signatures

Guido van Rossum guido@python.org
Thu, 18 Apr 2002 10:02:51 -0400


> Looking into Python's sources, I find mostly code like this:
> 
> static PyObject *
> func_get_code(PyFunctionObject *op)
> {
>         ....
> }
> 
> static PyGetSetDef func_getsetlist[] = {
>         {"func_code", (getter)func_get_code, (setter)func_set_code},
>         ....
>         {NULL} /* Sentinel */
> };
> 
> 
> 
> in other words, casting like hell to the correct function type.
> 
> Should a style like this should be preferred:
> 
> static PyObject *
> func_get_code(PyObject *py)
> {
>         PyFunctionObject *op = (PyFunctionObject *)py;
>         ....
> }
> 
> static PyGetSetDef func_getsetlist[] = {
>         {"func_code", func_get_code, func_set_code},
>         ....
>         {NULL} /* Sentinel */
> };
> 
> 
> in other words, move the cast where you are more sure about it's correctness,
> and give the compiler a change for meaningfull warnings.

I find that using the first form generally you end up using fewer
casts, and that's my preference (because casts obscure the code).

This is one area where I wish we could use C++, so
e.g. PyFunctionObject would be a subclass of PyObject... :-(

--Guido van Rossum (home page: http://www.python.org/~guido/)