Extended tuple's C API to include a new function, PyTuple_Pack() that is

useful for rapidly building argument tuples without having to invoke the
more sophisticated machinery of Py_BuildValue().
This commit is contained in:
Raymond Hettinger 2003-10-12 18:24:34 +00:00
parent d662548c72
commit cb2da43db8
4 changed files with 37 additions and 1 deletions

View file

@ -973,7 +973,7 @@ which is \ASCII. The file system calls should use
\cdata{Py_FileSystemDefaultEncoding} as the encoding for file
names. This variable should be treated as read-only: On some systems,
it will be a pointer to a static string, on others, it will change at
run-time, e.g. when the application invokes setlocale.
run-time (such as when the application invokes setlocale).
Error handling is set by errors which may also be set to \NULL{}
meaning to use the default handling defined for the codec. Default
@ -1584,6 +1584,14 @@ format.
Return a new tuple object of size \var{len}, or \NULL{} on failure.
\end{cfuncdesc}
\begin{cfuncdesc}{PyObject*}{PyTuple_Pack}{int n, \moreargs}
Return a new tuple object of size \var{n}, or \NULL{} on failure.
The tuple values are initialized to the subsequent \var{n} C arguments
pointing to Python objects. \samp{PyTuple_Pack(2, \var{a}, \var{b})}
is equivalent to \samp{Py_BuildValue("(OO)", \var{a}, \var{b})}.
\versionadded{2.4}
\end{cfuncdesc}
\begin{cfuncdesc}{int}{PyTuple_Size}{PyObject *p}
Takes a pointer to a tuple object, and returns the size of that
tuple.

View file

@ -35,6 +35,7 @@ PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, int);
PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, int, PyObject *);
PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, int, int);
PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, int);
PyAPI_FUNC(PyObject *) PyTuple_Pack(int, ...);
/* Macro, trading safety for speed */
#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i])

View file

@ -140,6 +140,11 @@ Build
C API
-----
- Added a new function, PyTuple_Pack(n, ...) for constructing tuples from a
variable length argument list of Python objects without having to invoke
the more complex machinery of Py_BuildValue(). PyTuple_Pack(3, a, b, c)
is equivalent to Py_BuildValue("(OOO)", a, b, c).
New platforms
-------------

View file

@ -130,6 +130,28 @@ PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem)
return 0;
}
PyObject *
PyTuple_Pack(int n, ...)
{
int i;
PyObject *o;
PyObject *result;
va_list vargs;
va_start(vargs, n);
result = PyTuple_New(n);
if (result == NULL)
return NULL;
for (i = 0; i < n; i++) {
o = va_arg(vargs, PyObject *);
Py_INCREF(o);
PyTuple_SET_ITEM(result, i, o);
}
va_end(vargs);
return result;
}
/* Methods */
static void