[3.12] gh-118814: Fix the TypeVar constructor when name is passed by … · python/cpython@f2cc8ad · GitHub
Skip to content

Commit f2cc8ad

Browse files
[3.12] gh-118814: Fix the TypeVar constructor when name is passed by keyword (GH-122664) (GH-122807)
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. (cherry picked from commit 540fcc6)
1 parent 8f4892a commit f2cc8ad

6 files changed

Lines changed: 151 additions & 7 deletions

File tree

Lib/test/test_clinic.py

Lines changed: 21 additions & 5 deletions

Lib/test/test_typing.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,41 @@ 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.__covariant__, False)
583+
self.assertIs(T.__contravariant__, False)
584+
self.assertIs(T.__infer_variance__, False)
585+
586+
T = TypeVar(name="T", bound=type)
587+
self.assertEqual(T.__name__, "T")
588+
self.assertEqual(T.__constraints__, ())
589+
self.assertIs(T.__bound__, type)
590+
self.assertIs(T.__covariant__, False)
591+
self.assertIs(T.__contravariant__, False)
592+
self.assertIs(T.__infer_variance__, False)
593+
594+
T = TypeVar(name="T", covariant=True)
595+
self.assertEqual(T.__name__, "T")
596+
self.assertEqual(T.__constraints__, ())
597+
self.assertIs(T.__bound__, None)
598+
self.assertIs(T.__covariant__, True)
599+
self.assertIs(T.__contravariant__, False)
600+
self.assertIs(T.__infer_variance__, False)
601+
602+
T = TypeVar(name="T", contravariant=True)
603+
self.assertEqual(T.__name__, "T")
604+
self.assertEqual(T.__constraints__, ())
605+
self.assertIs(T.__bound__, None)
606+
self.assertIs(T.__covariant__, False)
607+
self.assertIs(T.__contravariant__, True)
608+
self.assertIs(T.__infer_variance__, False)
609+
610+
T = TypeVar(name="T", infer_variance=True)
611+
self.assertEqual(T.__name__, "T")
612+
self.assertEqual(T.__constraints__, ())
613+
self.assertIs(T.__bound__, None)
614+
self.assertIs(T.__covariant__, False)
615+
self.assertIs(T.__contravariant__, False)
616+
self.assertIs(T.__infer_variance__, True)
582617

583618

584619
def template_replace(templates: list[str], replacements: dict[str, list[str]]) -> list[tuple[str]]:
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.

Modules/_testclinic.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,25 @@ vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args,
10341034
}
10351035

10361036

1037+
/*[clinic input]
1038+
vararg_with_default2
1039+
1040+
a: object
1041+
*args: object
1042+
b: object = None
1043+
c: object = None
1044+
1045+
[clinic start generated code]*/
1046+
1047+
static PyObject *
1048+
vararg_with_default2_impl(PyObject *module, PyObject *a, PyObject *args,
1049+
PyObject *b, PyObject *c)
1050+
/*[clinic end generated code: output=a0fb7c37796e2129 input=59fb22f5f0a8925f]*/
1051+
{
1052+
return pack_arguments_newref(4, a, args, b, c);
1053+
}
1054+
1055+
10371056
/*[clinic input]
10381057
vararg_with_only_defaults
10391058
@@ -1274,6 +1293,7 @@ static PyMethodDef tester_methods[] = {
12741293
VARARG_AND_POSONLY_METHODDEF
12751294
VARARG_METHODDEF
12761295
VARARG_WITH_DEFAULT_METHODDEF
1296+
VARARG_WITH_DEFAULT2_METHODDEF
12771297
VARARG_WITH_ONLY_DEFAULTS_METHODDEF
12781298
GH_32092_OOB_METHODDEF
12791299
GH_32092_KW_PASS_METHODDEF

Modules/clinic/_testclinic.c.h

Lines changed: 73 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/getargs.c

Lines changed: 1 addition & 1 deletion

0 commit comments

Comments
 (0)