diff options
author | Raymond Hettinger <python@rcn.com> | 2003-10-12 18:24:34 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2003-10-12 18:24:34 (GMT) |
commit | cb2da43db8943e9e7b1d900bce1d6416339d6f64 (patch) | |
tree | 91873c9ad0b19e9ab7e40f7d0a79db1bbc823df5 | |
parent | d662548c728e5e1da15d5594a8b6e751213002f8 (diff) | |
download | cpython-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.tex | 10 | ||||
-rw-r--r-- | Include/tupleobject.h | 1 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Objects/tupleobject.c | 22 |
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]) @@ -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 |