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