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().
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 @@
 \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 @@
   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(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 @@
 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 @@
 	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