gh-118814: Fix the TypeVar constructor when name is passed by keyword (GH-122664)

Fix _PyArg_UnpackKeywordsWithVararg for the case when argument for
positional-or-keyword parameter is passed by keyword.
There was only one such case in the stdlib -- the TypeVar constructor.
This commit is contained in:
Serhiy Storchaka 2024-08-07 23:30:10 +03:00 committed by GitHub
parent e73e7a7abd
commit 540fcc62f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 165 additions and 7 deletions

View file

@ -3334,11 +3334,27 @@ class ClinicFunctionalTest(unittest.TestCase):
self.assertEqual(ac_tester.vararg(1, 2, 3, 4), (1, (2, 3, 4)))
def test_vararg_with_default(self):
with self.assertRaises(TypeError):
ac_tester.vararg_with_default()
self.assertEqual(ac_tester.vararg_with_default(1, b=False), (1, (), False))
self.assertEqual(ac_tester.vararg_with_default(1, 2, 3, 4), (1, (2, 3, 4), False))
self.assertEqual(ac_tester.vararg_with_default(1, 2, 3, 4, b=True), (1, (2, 3, 4), True))
fn = ac_tester.vararg_with_default
self.assertRaises(TypeError, fn)
self.assertRaises(TypeError, fn, 1, a=2)
self.assertEqual(fn(1, b=2), (1, (), True))
self.assertEqual(fn(1, 2, 3, 4), (1, (2, 3, 4), False))
self.assertEqual(fn(1, 2, 3, 4, b=5), (1, (2, 3, 4), True))
self.assertEqual(fn(a=1), (1, (), False))
self.assertEqual(fn(a=1, b=2), (1, (), True))
def test_vararg_with_default2(self):
fn = ac_tester.vararg_with_default2
self.assertRaises(TypeError, fn)
self.assertRaises(TypeError, fn, 1, a=2)
self.assertEqual(fn(1, b=2), (1, (), 2, None))
self.assertEqual(fn(1, b=2, c=3), (1, (), 2, 3))
self.assertEqual(fn(1, 2, 3), (1, (2, 3), None, None))
self.assertEqual(fn(1, 2, 3, b=4), (1, (2, 3), 4, None))
self.assertEqual(fn(1, 2, 3, b=4, c=5), (1, (2, 3), 4, 5))
self.assertEqual(fn(a=1), (1, (), None, None))
self.assertEqual(fn(a=1, b=2), (1, (), 2, None))
self.assertEqual(fn(a=1, b=2, c=3), (1, (), 2, 3))
def test_vararg_with_only_defaults(self):
self.assertEqual(ac_tester.vararg_with_only_defaults(), ((), None))