Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Include/internal/pycore_modsupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ extern "C" {
#endif


extern int _PyArg_NoKwnames(const char *funcname, PyObject *kwnames);
// Export for 'array' shared extension
PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames);
#define _PyArg_NoKwnames(funcname, kwnames) \
((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames)))

Expand Down
20 changes: 5 additions & 15 deletions Lib/test/clinic.test.c
Original file line number Diff line number Diff line change
Expand Up @@ -6002,23 +6002,13 @@ static PyObject *
Test__pyarg_parsestackandkeywords(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
#else
# define KWTUPLE NULL
#endif

static const char * const _keywords[] = {"", NULL};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.format = "s#:_pyarg_parsestackandkeywords",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
const char *key;
Py_ssize_t key_length;

if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
if (!_PyArg_NoKwnames("_pyarg_parsestackandkeywords", kwnames)) {
goto exit;
}
if (!_PyArg_ParseStack(args, nargs, "s#:_pyarg_parsestackandkeywords",
&key, &key_length)) {
goto exit;
}
Expand All @@ -6032,7 +6022,7 @@ static PyObject *
Test__pyarg_parsestackandkeywords_impl(TestObj *self, PyTypeObject *cls,
const char *key,
Py_ssize_t key_length)
/*[clinic end generated code: output=7060c213d7b8200e input=fc72ef4b4cfafabc]*/
/*[clinic end generated code: output=21bbb9a8d0100d72 input=fc72ef4b4cfafabc]*/


/*[clinic input]
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -4898,7 +4898,7 @@ def test_defclass_posonly_varpos(self):
cls = ac_tester.TestClass
obj = cls()
fn = obj.defclass_posonly_varpos
errmsg = 'takes at least 2 positional arguments'
errmsg = 'expected at least 2 arguments'
self.assertRaisesRegex(TypeError, errmsg, fn)
self.assertRaisesRegex(TypeError, errmsg, fn, 1)
self.assertEqual(fn(1, 2), (cls, 1, 2, ()))
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_sqlite3/test_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ def test_trace_bad_handler(self):

def test_set_trace_callback_keyword_args(self):
with self.assertRaisesRegex(TypeError,
'takes exactly 1 positional argument'):
'takes no keyword arguments'):
self.con.set_trace_callback(trace_callback=lambda: None)

# When a handler has an invalid signature, the exception raised is
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_sqlite3/test_userfunctions.py
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ def test_aggr_text(self):

def test_agg_keyword_args(self):
with self.assertRaisesRegex(TypeError,
'takes exactly 3 positional arguments'):
'takes no keyword arguments'):
self.con.create_aggregate("test", 1, aggregate_class=AggrText)


Expand Down Expand Up @@ -767,7 +767,7 @@ def test_clear_authorizer(self):

def test_authorizer_keyword_args(self):
with self.assertRaisesRegex(TypeError,
'takes exactly 1 positional argument'):
'takes no keyword arguments'):
self.con.set_authorizer(authorizer_callback=lambda: None)


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Argument Clinic now parses arguments of positional-only methods with a
*defining class* directly, without a :c:type:`!_PyArg_Parser`.
Loading
Loading