What is the "correct" way to pass a boolean to a Python C extension? What is the "correct" way to pass a boolean to a Python C extension? python python

What is the "correct" way to pass a boolean to a Python C extension?


4 maybe there's a way to get any type of variable and get its truth value (i.e an empty array will is falsy etc.) which is what python function usually do.

Yes: (from Python/C API Reference)

int PyObject_IsTrue(PyObject *o)

Returns 1 if the object o is considered to be true, and 0 otherwise. This is equivalent to the Python expression not not o. On failure, return -1.

EDIT. To answer the actual question, I think approach 1 is correct, because int really is the corresponding type in C. Approach 4 is good, but if you document your function as taking a bool, you are not obligated to accept just any object. Explicit type checks as in 3 without a reason are frowned upon in Python. Conversion to another Python object as in 2 does not help your C code.


Currently, parsing an integer (as "i") is the accepted way to take a bool.

From Python 3.3, PyArg_ParseTuple will accept "p" (for "predicate"), per the latest NEWS:

  • Issue #14705: The PyArg_Parse() family of functions now support the 'p' format unit, which accepts a "boolean predicate" argument. It converts any Python value into an integer--0 if it is "false", and 1 otherwise.

Note that when using PyArg_ParseTuple with "p", the argument must be a (pointer to) int, not the C99 bool type:

int x;    // not "bool x"PyArg_ParseTuple(args, kwds, "p", &x);


I have found another approach:

PyObject* py_expectArgs;bool expectArgs;PyArg_ParseTupleAndKeywords(args, keywds, (char *)"O!", (char **)kwlist, &PyBool_Type, &py_expectArgs);expectArgs = PyObject_IsTrue(py_expectArgs);

In case of wrong param call there is "auto" exception "argument 1 must be bool, not int"