@@ -1502,6 +1502,50 @@ _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1502
1502
return retval ;
1503
1503
}
1504
1504
1505
+ static void
1506
+ error_unexpected_keyword_arg (PyObject * kwargs , PyObject * kwnames , PyObject * kwtuple , const char * fname )
1507
+ {
1508
+ /* make sure there are no extraneous keyword arguments */
1509
+ Py_ssize_t j = 0 ;
1510
+ while (1 ) {
1511
+ PyObject * keyword ;
1512
+ if (kwargs != NULL ) {
1513
+ if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
1514
+ break ;
1515
+ }
1516
+ else {
1517
+ if (j >= PyTuple_GET_SIZE (kwnames ))
1518
+ break ;
1519
+ keyword = PyTuple_GET_ITEM (kwnames , j );
1520
+ j ++ ;
1521
+ }
1522
+ if (!PyUnicode_Check (keyword )) {
1523
+ PyErr_SetString (PyExc_TypeError ,
1524
+ "keywords must be strings" );
1525
+ return ;
1526
+ }
1527
+
1528
+ int match = PySequence_Contains (kwtuple , keyword );
1529
+ if (match <= 0 ) {
1530
+ if (!match ) {
1531
+ PyErr_Format (PyExc_TypeError ,
1532
+ "'%S' is an invalid keyword "
1533
+ "argument for %.200s%s" ,
1534
+ keyword ,
1535
+ (fname == NULL ) ? "this function" : fname ,
1536
+ (fname == NULL ) ? "" : "()" );
1537
+ }
1538
+ return ;
1539
+ }
1540
+ }
1541
+ /* Something wrong happened. There are extraneous keyword arguments,
1542
+ * but we don't know what. And we don't bother. */
1543
+ PyErr_Format (PyExc_TypeError ,
1544
+ "invalid keyword argument for %.200s%s" ,
1545
+ (fname == NULL ) ? "this function" : fname ,
1546
+ (fname == NULL ) ? "" : "()" );
1547
+ }
1548
+
1505
1549
int
1506
1550
PyArg_ValidateKeywordArguments (PyObject * kwargs )
1507
1551
{
@@ -1790,6 +1834,13 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format,
1790
1834
return cleanreturn (0 , & freelist );
1791
1835
}
1792
1836
}
1837
+ /* Something wrong happened. There are extraneous keyword arguments,
1838
+ * but we don't know what. And we don't bother. */
1839
+ PyErr_Format (PyExc_TypeError ,
1840
+ "invalid keyword argument for %.200s%s" ,
1841
+ (fname == NULL ) ? "this function" : fname ,
1842
+ (fname == NULL ) ? "" : "()" );
1843
+ return cleanreturn (0 , & freelist );
1793
1844
}
1794
1845
1795
1846
return cleanreturn (1 , & freelist );
@@ -2132,7 +2183,6 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
2132
2183
assert (IS_END_OF_FORMAT (* format ) || (* format == '|' ) || (* format == '$' ));
2133
2184
2134
2185
if (nkwargs > 0 ) {
2135
- Py_ssize_t j ;
2136
2186
/* make sure there are no arguments given by name and position */
2137
2187
for (i = pos ; i < nargs ; i ++ ) {
2138
2188
keyword = PyTuple_GET_ITEM (kwtuple , i - pos );
@@ -2156,34 +2206,9 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
2156
2206
return cleanreturn (0 , & freelist );
2157
2207
}
2158
2208
}
2159
- /* make sure there are no extraneous keyword arguments */
2160
- j = 0 ;
2161
- while (1 ) {
2162
- int match ;
2163
- if (kwargs != NULL ) {
2164
- if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
2165
- break ;
2166
- }
2167
- else {
2168
- if (j >= PyTuple_GET_SIZE (kwnames ))
2169
- break ;
2170
- keyword = PyTuple_GET_ITEM (kwnames , j );
2171
- j ++ ;
2172
- }
2173
2209
2174
- match = PySequence_Contains (kwtuple , keyword );
2175
- if (match <= 0 ) {
2176
- if (!match ) {
2177
- PyErr_Format (PyExc_TypeError ,
2178
- "'%S' is an invalid keyword "
2179
- "argument for %.200s%s" ,
2180
- keyword ,
2181
- (parser -> fname == NULL ) ? "this function" : parser -> fname ,
2182
- (parser -> fname == NULL ) ? "" : "()" );
2183
- }
2184
- return cleanreturn (0 , & freelist );
2185
- }
2186
- }
2210
+ error_unexpected_keyword_arg (kwargs , kwnames , kwtuple , parser -> fname );
2211
+ return cleanreturn (0 , & freelist );
2187
2212
}
2188
2213
2189
2214
return cleanreturn (1 , & freelist );
@@ -2357,7 +2382,6 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs,
2357
2382
}
2358
2383
2359
2384
if (nkwargs > 0 ) {
2360
- Py_ssize_t j ;
2361
2385
/* make sure there are no arguments given by name and position */
2362
2386
for (i = posonly ; i < nargs ; i ++ ) {
2363
2387
keyword = PyTuple_GET_ITEM (kwtuple , i - posonly );
@@ -2381,34 +2405,9 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs,
2381
2405
return NULL ;
2382
2406
}
2383
2407
}
2384
- /* make sure there are no extraneous keyword arguments */
2385
- j = 0 ;
2386
- while (1 ) {
2387
- int match ;
2388
- if (kwargs != NULL ) {
2389
- if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
2390
- break ;
2391
- }
2392
- else {
2393
- if (j >= PyTuple_GET_SIZE (kwnames ))
2394
- break ;
2395
- keyword = PyTuple_GET_ITEM (kwnames , j );
2396
- j ++ ;
2397
- }
2398
2408
2399
- match = PySequence_Contains (kwtuple , keyword );
2400
- if (match <= 0 ) {
2401
- if (!match ) {
2402
- PyErr_Format (PyExc_TypeError ,
2403
- "'%S' is an invalid keyword "
2404
- "argument for %.200s%s" ,
2405
- keyword ,
2406
- (parser -> fname == NULL ) ? "this function" : parser -> fname ,
2407
- (parser -> fname == NULL ) ? "" : "()" );
2408
- }
2409
- return NULL ;
2410
- }
2411
- }
2409
+ error_unexpected_keyword_arg (kwargs , kwnames , kwtuple , parser -> fname );
2410
+ return NULL ;
2412
2411
}
2413
2412
2414
2413
return buf ;
@@ -2537,35 +2536,8 @@ _PyArg_UnpackKeywordsWithVararg(PyObject *const *args, Py_ssize_t nargs,
2537
2536
}
2538
2537
2539
2538
if (nkwargs > 0 ) {
2540
- Py_ssize_t j ;
2541
- /* make sure there are no extraneous keyword arguments */
2542
- j = 0 ;
2543
- while (1 ) {
2544
- int match ;
2545
- if (kwargs != NULL ) {
2546
- if (!PyDict_Next (kwargs , & j , & keyword , NULL ))
2547
- break ;
2548
- }
2549
- else {
2550
- if (j >= PyTuple_GET_SIZE (kwnames ))
2551
- break ;
2552
- keyword = PyTuple_GET_ITEM (kwnames , j );
2553
- j ++ ;
2554
- }
2555
-
2556
- match = PySequence_Contains (kwtuple , keyword );
2557
- if (match <= 0 ) {
2558
- if (!match ) {
2559
- PyErr_Format (PyExc_TypeError ,
2560
- "'%S' is an invalid keyword "
2561
- "argument for %.200s%s" ,
2562
- keyword ,
2563
- (parser -> fname == NULL ) ? "this function" : parser -> fname ,
2564
- (parser -> fname == NULL ) ? "" : "()" );
2565
- }
2566
- goto exit ;
2567
- }
2568
- }
2539
+ error_unexpected_keyword_arg (kwargs , kwnames , kwtuple , parser -> fname );
2540
+ goto exit ;
2569
2541
}
2570
2542
2571
2543
return buf ;
0 commit comments