Skip to content

Commit dc5949e

Browse files
pythongh-118814: Fix the TypeVar constructor when name is passed by keyword
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.
1 parent e6fad7a commit dc5949e

3 files changed

Lines changed: 51 additions & 1 deletion

File tree

‎Lib/test/test_typing.py‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,55 @@ def test_constructor(self):
579579
self.assertEqual(T.__name__, "T")
580580
self.assertEqual(T.__constraints__, ())
581581
self.assertIs(T.__bound__, None)
582+
self.assertIs(T.__default__, typing.NoDefault)
583+
self.assertIs(T.__covariant__, False)
584+
self.assertIs(T.__contravariant__, False)
585+
self.assertIs(T.__infer_variance__, False)
586+
587+
T = TypeVar(name="T", bound=type)
588+
self.assertEqual(T.__name__, "T")
589+
self.assertEqual(T.__constraints__, ())
590+
self.assertIs(T.__bound__, type)
591+
self.assertIs(T.__default__, typing.NoDefault)
592+
self.assertIs(T.__covariant__, False)
593+
self.assertIs(T.__contravariant__, False)
594+
self.assertIs(T.__infer_variance__, False)
595+
596+
T = TypeVar(name="T", default=())
597+
self.assertEqual(T.__name__, "T")
598+
self.assertEqual(T.__constraints__, ())
599+
self.assertIs(T.__bound__, None)
600+
self.assertIs(T.__default__, ())
601+
self.assertIs(T.__covariant__, False)
602+
self.assertIs(T.__contravariant__, False)
603+
self.assertIs(T.__infer_variance__, False)
604+
605+
T = TypeVar(name="T", covariant=True)
606+
self.assertEqual(T.__name__, "T")
607+
self.assertEqual(T.__constraints__, ())
608+
self.assertIs(T.__bound__, None)
609+
self.assertIs(T.__default__, typing.NoDefault)
610+
self.assertIs(T.__covariant__, True)
611+
self.assertIs(T.__contravariant__, False)
612+
self.assertIs(T.__infer_variance__, False)
613+
614+
T = TypeVar(name="T", contravariant=True)
615+
self.assertEqual(T.__name__, "T")
616+
self.assertEqual(T.__constraints__, ())
617+
self.assertIs(T.__bound__, None)
618+
self.assertIs(T.__default__, typing.NoDefault)
619+
self.assertIs(T.__covariant__, False)
620+
self.assertIs(T.__contravariant__, True)
621+
self.assertIs(T.__infer_variance__, False)
622+
623+
T = TypeVar(name="T", infer_variance=True)
624+
self.assertEqual(T.__name__, "T")
625+
self.assertEqual(T.__constraints__, ())
626+
self.assertIs(T.__bound__, None)
627+
self.assertIs(T.__default__, typing.NoDefault)
628+
self.assertIs(T.__covariant__, False)
629+
self.assertIs(T.__contravariant__, False)
630+
self.assertIs(T.__infer_variance__, True)
582631

583632

584633
class TypeParameterDefaultsTests(BaseTestCase):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix the :class:`typing.TypeVar` constructor when name is passed by keyword.

‎Python/getargs.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2601,7 +2601,7 @@ _PyArg_UnpackKeywordsWithVararg(PyObject *const *args, Py_ssize_t nargs,
26012601
*
26022602
* Otherwise, we leave a place at `buf[vararg]` for vararg tuple
26032603
* so the index is `i + 1`. */
2604-
if (nargs < vararg && i != vararg) {
2604+
if (i < vararg) {
26052605
buf[i] = current_arg;
26062606
}
26072607
else {

0 commit comments

Comments
 (0)