Skip to content

Commit 1253b13

Browse files
committed
Add _PyArg_NoStackKeywords() helper function
Issue #29286. Similar to _PyArg_NoKeywords(), but expects a tuple of keyword names, instead of a dict.
1 parent 8ab14d4 commit 1253b13

2 files changed

Lines changed: 23 additions & 5 deletions

File tree

Include/modsupport.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
4848
PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
4949
#endif
5050
#ifndef Py_LIMITED_API
51-
PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw);
51+
PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs);
52+
PyAPI_FUNC(int) _PyArg_NoStackKeywords(const char *funcname, PyObject *kwnames);
5253
PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args);
5354

5455
PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list);

Python/getargs.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2429,16 +2429,33 @@ PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t m
24292429
* not empty, returns 1 otherwise
24302430
*/
24312431
int
2432-
_PyArg_NoKeywords(const char *funcname, PyObject *kw)
2432+
_PyArg_NoKeywords(const char *funcname, PyObject *kwargs)
24332433
{
2434-
if (kw == NULL)
2434+
if (kwargs == NULL)
24352435
return 1;
2436-
if (!PyDict_CheckExact(kw)) {
2436+
if (!PyDict_CheckExact(kwargs)) {
24372437
PyErr_BadInternalCall();
24382438
return 0;
24392439
}
2440-
if (PyDict_GET_SIZE(kw) == 0)
2440+
if (PyDict_GET_SIZE(kwargs) == 0) {
24412441
return 1;
2442+
}
2443+
2444+
PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments",
2445+
funcname);
2446+
return 0;
2447+
}
2448+
2449+
2450+
int
2451+
_PyArg_NoStackKeywords(const char *funcname, PyObject *kwnames)
2452+
{
2453+
if (kwnames == NULL)
2454+
return 1;
2455+
assert(PyTuple_CheckExact(kwnames));
2456+
if (PyTuple_GET_SIZE(kwnames) == 0) {
2457+
return 1;
2458+
}
24422459

24432460
PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments",
24442461
funcname);

0 commit comments

Comments
 (0)