This is a simple example from the python documentation (http://docs.python.org/extending/extending.html):
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return Py_BuildValue("i", sts);
}
If I want to pass an additional boolean parameter to the function - what's the "correct" way to do it?
There doesn't seem to be a bool option to pass to PyArg_ParseTuple(). So I thought of the following:
Any of these preferable? Other options?
4 maybe there's a way to get any type of variable and get its truth value (ie 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"
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.