Skip to content

Commit ba776ea

Browse files
Add TypeVar(infer_variance=True) (#80)
From PEP 695. Fixes #79.
1 parent fafb5c5 commit ba776ea

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# Release 4.4.0 ()
2+
23
- Add `typing_extensions.Any` a backport of python 3.11's Any class which is
34
subclassable at runtime. (backport from python/cpython#31841, by Shantanu
45
and Jelle Zijlstra). Patch by James Hilton-Balfe (@Gobot1234).
56
- Add initial support for TypeVarLike `default` parameter, PEP 696.
67
Patch by Marc Mueller (@cdce8p).
8+
- Add the `infer_variance` parameter to `TypeVar`, as specified in PEP 695.
9+
Patch by Jelle Zijlstra.
710

811
# Release 4.3.0 (July 1, 2022)
912

src/test_typing_extensions.py

+23
Original file line numberDiff line numberDiff line change
@@ -3449,5 +3449,28 @@ def test_pickle(self):
34493449
self.assertEqual(z.__default__, typevar.__default__)
34503450

34513451

3452+
class TypeVarInferVarianceTests(BaseTestCase):
3453+
def test_typevar(self):
3454+
T = typing_extensions.TypeVar('T')
3455+
self.assertFalse(T.__infer_variance__)
3456+
T_infer = typing_extensions.TypeVar('T_infer', infer_variance=True)
3457+
self.assertTrue(T_infer.__infer_variance__)
3458+
T_noinfer = typing_extensions.TypeVar('T_noinfer', infer_variance=False)
3459+
self.assertFalse(T_noinfer.__infer_variance__)
3460+
3461+
def test_pickle(self):
3462+
global U, U_infer # pickle wants to reference the class by name
3463+
U = typing_extensions.TypeVar('U')
3464+
U_infer = typing_extensions.TypeVar('U_infer', infer_variance=True)
3465+
for proto in range(pickle.HIGHEST_PROTOCOL):
3466+
for typevar in (U, U_infer):
3467+
z = pickle.loads(pickle.dumps(typevar, proto))
3468+
self.assertEqual(z.__name__, typevar.__name__)
3469+
self.assertEqual(z.__covariant__, typevar.__covariant__)
3470+
self.assertEqual(z.__contravariant__, typevar.__contravariant__)
3471+
self.assertEqual(z.__bound__, typevar.__bound__)
3472+
self.assertEqual(z.__infer_variance__, typevar.__infer_variance__)
3473+
3474+
34523475
if __name__ == '__main__':
34533476
main()

src/typing_extensions.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1163,18 +1163,19 @@ def __init__(self, default):
11631163
self.__default__ = None
11641164

11651165

1166-
# Add default Parameter - PEP 696
1166+
# Add default and infer_variance parameters from PEP 696 and 695
11671167
class TypeVar(typing.TypeVar, _DefaultMixin, _root=True):
11681168
"""Type variable."""
11691169

11701170
__module__ = 'typing'
11711171

11721172
def __init__(self, name, *constraints, bound=None,
11731173
covariant=False, contravariant=False,
1174-
default=None):
1174+
default=None, infer_variance=False):
11751175
super().__init__(name, *constraints, bound=bound, covariant=covariant,
11761176
contravariant=contravariant)
11771177
_DefaultMixin.__init__(self, default)
1178+
self.__infer_variance__ = infer_variance
11781179

11791180
# for pickling:
11801181
try:

0 commit comments

Comments
 (0)