[Python-Dev] A macro for easier rich comparisons

Victor Stinner victor.stinner at gmail.com
Tue Apr 28 11:13:56 CEST 2015


Hi,

2015-04-27 16:02 GMT+02:00 Petr Viktorin <encukou at gmail.com>:
> A macro like this would reduce boilerplate in stdlib and third-party C
> extensions. It would ease porting C extensions to Python 3, where rich
> comparison is mandatory.

It would be nice to have a six module for C extensions. I'm quite sure
that many projects are already full of #ifdef PYTHON3 ... #else ...
#endif macros.

> #define Py_RETURN_RICHCOMPARE(val1, val2, op)                               \
>     do {                                                                    \
>         switch (op) {                                                       \
>         case Py_EQ: if ((val1) == (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE;  \
>         case Py_NE: if ((val1) != (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE;  \
>         case Py_LT: if ((val1) < (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE;   \
>         case Py_GT: if ((val1) > (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE;   \
>         case Py_LE: if ((val1) <= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE;  \
>         case Py_GE: if ((val1) >= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE;  \
>         }                                                                   \
>         Py_RETURN_NOTIMPLEMENTED;                                           \
>     } while (0)

I would prefer a function for that:

PyObject *Py_RichCompare(long val1, long2, int op);

You should also handle invalid operator. PyUnicode_RichCompare() calls
PyErr_BadArgument() in this case.

Anyway, please open an issue for this idea.

Victor


More information about the Python-Dev mailing list