mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fulton, based on code Jim supplied.
This commit is contained in:
parent
4855b02554
commit
e4616e6752
2 changed files with 61 additions and 0 deletions
|
@ -1360,3 +1360,63 @@ skipitem(char **p_format, va_list *p_va)
|
|||
*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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue