summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-10-12 18:24:34 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-10-12 18:24:34 (GMT)
commitcb2da43db8943e9e7b1d900bce1d6416339d6f64 (patch)
tree91873c9ad0b19e9ab7e40f7d0a79db1bbc823df5
parentd662548c728e5e1da15d5594a8b6e751213002f8 (diff)
downloadcpython-cb2da43db8943e9e7b1d900bce1d6416339d6f64.zip
cpython-cb2da43db8943e9e7b1d900bce1d6416339d6f64.tar.gz
cpython-cb2da43db8943e9e7b1d900bce1d6416339d6f64.tar.bz2
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().
-rw-r--r--Doc/api/concrete.tex10
-rw-r--r--Include/tupleobject.h1
-rw-r--r--Misc/NEWS5
-rw-r--r--Objects/tupleobject.c22
4 files changed, 37 insertions, 1 deletions
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