From cb2da43db8943e9e7b1d900bce1d6416339d6f64 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 12 Oct 2003 18:24:34 +0000 Subject: 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(). --- Doc/api/concrete.tex | 10 +++++++++- Include/tupleobject.h | 1 + Misc/NEWS | 5 +++++ Objects/tupleobject.c | 22 ++++++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Doc/api/concrete.tex b/Doc/api/concrete.tex index 5b0d9e3..7b84092 100644 --- a/Doc/api/concrete.tex +++ b/Doc/api/concrete.tex @@ -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. diff --git a/Include/tupleobject.h b/Include/tupleobject.h index 58bf896..f1839fe 100644 --- a/Include/tupleobject.h +++ b/Include/tupleobject.h @@ -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]) diff --git a/Misc/NEWS b/Misc/NEWS index 0ee896d..eb57e68 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 ------------- diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 282da3e..ef5cb85 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -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 -- cgit v0.12