@@ -1553,6 +1553,50 @@ _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1553
1553
return retval ;
1554
1554
}
1555
1555
1556
+ static void
1557
+ error_unexpected_keyword_arg (PyObject * kwargs , PyObject * kwnames , PyObject * kwtuple , const char * fname )
1558
+ {
1559
+ /* make sure there are no extraneous keyword arguments */
1560
+ Py_ssize_t j = 0 ;
1561
+ while (1 ) {
1562
+ PyObject * keyword ;
1563
+ if (kwargs != NULL ) {
1564
+ if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
1565
+ break ;
1566
+ }
1567
+ else {
1568
+ if (j >= PyTuple_GET_SIZE (kwnames ))
1569
+ break ;
1570
+ keyword = PyTuple_GET_ITEM (kwnames , j );
1571
+ j ++ ;
1572
+ }
1573
+ if (!PyUnicode_Check (keyword )) {
1574
+ PyErr_SetString (PyExc_TypeError ,
1575
+ "keywords must be strings" );
1576
+ return ;
1577
+ }
1578
+
1579
+ int match = PySequence_Contains (kwtuple , keyword );
1580
+ if (match <= 0 ) {
1581
+ if (!match ) {
1582
+ PyErr_Format (PyExc_TypeError ,
1583
+ "'%S' is an invalid keyword "
1584
+ "argument for %.200s%s" ,
1585
+ keyword ,
1586
+ (fname == NULL ) ? "this function" : fname ,
1587
+ (fname == NULL ) ? "" : "()" );
1588
+ }
1589
+ return ;
1590
+ }
1591
+ }
1592
+ /* Something wrong happened. There are extraneous keyword arguments,
1593
+ * but we don't know what. And we don't bother. */
1594
+ PyErr_Format (PyExc_TypeError ,
1595
+ "invalid keyword argument for %.200s%s" ,
1596
+ (fname == NULL ) ? "this function" : fname ,
1597
+ (fname == NULL ) ? "" : "()" );
1598
+ }
1599
+
1556
1600
int
1557
1601
PyArg_ValidateKeywordArguments (PyObject * kwargs )
1558
1602
{
@@ -1841,6 +1885,13 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format,
1841
1885
return cleanreturn (0 , & freelist );
1842
1886
}
1843
1887
}
1888
+ /* Something wrong happened. There are extraneous keyword arguments,
1889
+ * but we don't know what. And we don't bother. */
1890
+ PyErr_Format (PyExc_TypeError ,
1891
+ "invalid keyword argument for %.200s%s" ,
1892
+ (fname == NULL ) ? "this function" : fname ,
1893
+ (fname == NULL ) ? "" : "()" );
1894
+ return cleanreturn (0 , & freelist );
1844
1895
}
1845
1896
1846
1897
return cleanreturn (1 , & freelist );
@@ -2183,7 +2234,6 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
2183
2234
assert (IS_END_OF_FORMAT (* format ) || (* format == '|' ) || (* format == '$' ));
2184
2235
2185
2236
if (nkwargs > 0 ) {
2186
- Py_ssize_t j ;
2187
2237
/* make sure there are no arguments given by name and position */
2188
2238
for (i = pos ; i < nargs ; i ++ ) {
2189
2239
keyword = PyTuple_GET_ITEM (kwtuple , i - pos );
@@ -2207,34 +2257,9 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
2207
2257
return cleanreturn (0 , & freelist );
2208
2258
}
2209
2259
}
2210
- /* make sure there are no extraneous keyword arguments */
2211
- j = 0 ;
2212
- while (1 ) {
2213
- int match ;
2214
- if (kwargs != NULL ) {
2215
- if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
2216
- break ;
2217
- }
2218
- else {
2219
- if (j >= PyTuple_GET_SIZE (kwnames ))
2220
- break ;
2221
- keyword = PyTuple_GET_ITEM (kwnames , j );
2222
- j ++ ;
2223
- }
2224
2260
2225
- match = PySequence_Contains (kwtuple , keyword );
2226
- if (match <= 0 ) {
2227
- if (!match ) {
2228
- PyErr_Format (PyExc_TypeError ,
2229
- "'%S' is an invalid keyword "
2230
- "argument for %.200s%s" ,
2231
- keyword ,
2232
- (parser -> fname == NULL ) ? "this function" : parser -> fname ,
2233
- (parser -> fname == NULL ) ? "" : "()" );
2234
- }
2235
- return cleanreturn (0 , & freelist );
2236
- }
2237
- }
2261
+ error_unexpected_keyword_arg (kwargs , kwnames , kwtuple , parser -> fname );
2262
+ return cleanreturn (0 , & freelist );
2238
2263
}
2239
2264
2240
2265
return cleanreturn (1 , & freelist );
@@ -2408,7 +2433,6 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs,
2408
2433
}
2409
2434
2410
2435
if (nkwargs > 0 ) {
2411
- Py_ssize_t j ;
2412
2436
/* make sure there are no arguments given by name and position */
2413
2437
for (i = posonly ; i < nargs ; i ++ ) {
2414
2438
keyword = PyTuple_GET_ITEM (kwtuple , i - posonly );
@@ -2432,34 +2456,9 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs,
2432
2456
return NULL ;
2433
2457
}
2434
2458
}
2435
- /* make sure there are no extraneous keyword arguments */
2436
- j = 0 ;
2437
- while (1 ) {
2438
- int match ;
2439
- if (kwargs != NULL ) {
2440
- if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
2441
- break ;
2442
- }
2443
- else {
2444
- if (j >= PyTuple_GET_SIZE (kwnames ))
2445
- break ;
2446
- keyword = PyTuple_GET_ITEM (kwnames , j );
2447
- j ++ ;
2448
- }
2449
2459
2450
- match = PySequence_Contains (kwtuple , keyword );
2451
- if (match <= 0 ) {
2452
- if (!match ) {
2453
- PyErr_Format (PyExc_TypeError ,
2454
- "'%S' is an invalid keyword "
2455
- "argument for %.200s%s" ,
2456
- keyword ,
2457
- (parser -> fname == NULL ) ? "this function" : parser -> fname ,
2458
- (parser -> fname == NULL ) ? "" : "()" );
2459
- }
2460
- return NULL ;
2461
- }
2462
- }
2460
+ error_unexpected_keyword_arg (kwargs , kwnames , kwtuple , parser -> fname );
2461
+ return NULL ;
2463
2462
}
2464
2463
2465
2464
return buf ;
0 commit comments