Mercurial > cpython-lru_cache-weakref
diff Python/getargs.c @ 20632:6c84d55abb58 legacy-trunk
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fulton, based on code Jim supplied.
| author | Fred Drake <fdrake@acm.org> |
|---|---|
| date | Tue, 23 Oct 2001 21:09:29 +0000 |
| parents | acc7e3b4d042 |
| children | e912b683ed3e |
line wrap: on
line diff
--- a/Python/getargs.c Tue Oct 23 20:26:16 2001 +0000 +++ b/Python/getargs.c Tue Oct 23 21:09:29 2001 +0000 @@ -1360,3 +1360,63 @@ *p_format = format; return NULL; } + + +int +PyArg_UnpackTuple(PyObject *args, char *name, int min, int max, ...) +{ + int i, l; + PyObject **o; + va_list vargs; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, max); +#else + va_start(vargs); +#endif + + assert(min >= 0); + assert(min <= max); + if (!PyTuple_Check(args)) { + PyErr_SetString(PyExc_SystemError, + "PyArg_UnpackTuple() argument list is not a tuple"); + return 0; + } + l = PyTuple_GET_SIZE(args); + if (l < min) { + if (name != NULL) + PyErr_Format( + PyExc_TypeError, + "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), min, l); + else + PyErr_Format( + PyExc_TypeError, + "unpacked tuple should have %s%d elements," + " but has %d", + (min == max ? "" : "at least "), min, l); + va_end(vargs); + return 0; + } + if (l > max) { + if (name != NULL) + PyErr_Format( + PyExc_TypeError, + "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), max, l); + else + PyErr_Format( + PyExc_TypeError, + "unpacked tuple should have %s%d elements," + " but has %d", + (min == max ? "" : "at most "), max, l); + va_end(vargs); + return 0; + } + for (i = 0; i < l; i++) { + o = va_arg(vargs, PyObject **); + *o = PyTuple_GET_ITEM(args, i); + } + va_end(vargs); + return 1; +}
