[Python-checkins] bpo-46644: Remove callable() requirement from typing._type_check (GH-31151)

JelleZijlstra webhook-mailer at python.org
Fri Mar 11 20:12:26 EST 2022


https://github.com/python/cpython/commit/870b22b9c442d035190d2b8fb82256cd9a03da48
commit: 870b22b9c442d035190d2b8fb82256cd9a03da48
branch: main
author: Gregory Beauregard <greg at greg.red>
committer: JelleZijlstra <jelle.zijlstra at gmail.com>
date: 2022-03-11T17:12:17-08:00
summary:

bpo-46644: Remove callable() requirement from typing._type_check (GH-31151)

We also remove all the tests that check for integer literals.

files:
A Misc/NEWS.d/next/Library/2022-02-05-22-14-44.bpo-46644.P--1Cz.rst
M Lib/test/test_types.py
M Lib/test/test_typing.py
M Lib/typing.py

diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index b8b1ce96f93c3..f8b239117f513 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -875,7 +875,7 @@ def test_union_parameter_substitution_errors(self):
         T = typing.TypeVar("T")
         x = int | T
         with self.assertRaises(TypeError):
-            x[42]
+            x[int, str]
 
     def test_or_type_operator_with_forward(self):
         T = typing.TypeVar('T')
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index a6936653bc566..c619042928bbd 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -345,7 +345,7 @@ def test_cannot_instantiate_vars(self):
 
     def test_bound_errors(self):
         with self.assertRaises(TypeError):
-            TypeVar('X', bound=42)
+            TypeVar('X', bound=Union)
         with self.assertRaises(TypeError):
             TypeVar('X', str, float, bound=Employee)
 
@@ -2591,9 +2591,6 @@ def test_extended_generic_rules_eq(self):
         class Base: ...
         class Derived(Base): ...
         self.assertEqual(Union[T, Base][Union[Base, Derived]], Union[Base, Derived])
-        with self.assertRaises(TypeError):
-            Union[T, int][1]
-
         self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
         self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
 
@@ -3136,8 +3133,6 @@ class Foo(obj):
 class ClassVarTests(BaseTestCase):
 
     def test_basics(self):
-        with self.assertRaises(TypeError):
-            ClassVar[1]
         with self.assertRaises(TypeError):
             ClassVar[int, str]
         with self.assertRaises(TypeError):
@@ -3176,8 +3171,6 @@ class FinalTests(BaseTestCase):
 
     def test_basics(self):
         Final[int]  # OK
-        with self.assertRaises(TypeError):
-            Final[1]
         with self.assertRaises(TypeError):
             Final[int, str]
         with self.assertRaises(TypeError):
@@ -3591,14 +3584,6 @@ def foo(a: 'Node[T'):
         with self.assertRaises(SyntaxError):
             get_type_hints(foo)
 
-    def test_type_error(self):
-
-        def foo(a: Tuple['42']):
-            pass
-
-        with self.assertRaises(TypeError):
-            get_type_hints(foo)
-
     def test_name_error(self):
 
         def foo(a: 'Noode[T]'):
@@ -5011,8 +4996,6 @@ def test_namedtuple_keyword_usage(self):
         self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int))
         with self.assertRaises(TypeError):
             NamedTuple('Name', [('x', int)], y=str)
-        with self.assertRaises(TypeError):
-            NamedTuple('Name', x=1, y='a')
 
     def test_namedtuple_special_keyword_names(self):
         NT = NamedTuple("NT", cls=type, self=object, typename=str, fields=list)
@@ -5048,8 +5031,6 @@ def test_namedtuple_errors(self):
             NamedTuple('Emp', [('_name', str)])
         with self.assertRaises(TypeError):
             NamedTuple(typename='Emp', name=str, id=int)
-        with self.assertRaises(TypeError):
-            NamedTuple('Emp', fields=[('name', str), ('id', int)])
 
     def test_copy_and_pickle(self):
         global Emp  # pickle wants to reference the class by name
@@ -5124,7 +5105,6 @@ def test_typeddict_create_errors(self):
             TypedDict()
         with self.assertRaises(TypeError):
             TypedDict('Emp', [('name', str)], None)
-
         with self.assertRaises(TypeError):
             TypedDict(_typename='Emp', name=str, id=int)
 
@@ -5138,13 +5118,6 @@ def test_typeddict_errors(self):
             isinstance(jim, Emp)
         with self.assertRaises(TypeError):
             issubclass(dict, Emp)
-        # We raise a DeprecationWarning for the keyword syntax
-        # before the TypeError.
-        with self.assertWarns(DeprecationWarning):
-            with self.assertRaises(TypeError):
-                TypedDict('Hi', x=1)
-        with self.assertRaises(TypeError):
-            TypedDict('Hi', [('x', int), ('y', 1)])
         with self.assertRaises(TypeError):
             TypedDict('Hi', [('x', int)], y=int)
 
@@ -5916,6 +5889,9 @@ def test_basics(self):
         def foo(arg) -> TypeGuard[int]: ...
         self.assertEqual(gth(foo), {'return': TypeGuard[int]})
 
+        with self.assertRaises(TypeError):
+            TypeGuard[int, str]
+
     def test_repr(self):
         self.assertEqual(repr(TypeGuard), 'typing.TypeGuard')
         cv = TypeGuard[int]
diff --git a/Lib/typing.py b/Lib/typing.py
index 842554f193ca7..dd68e71db1558 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -185,10 +185,7 @@ def _type_check(arg, msg, is_argument=True, module=None, *, allow_special_forms=
         return arg
     if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
         raise TypeError(f"Plain {arg} is not valid as type argument")
-    if isinstance(arg, (type, TypeVar, ForwardRef, types.UnionType, ParamSpec,
-                        ParamSpecArgs, ParamSpecKwargs, TypeVarTuple)):
-        return arg
-    if not callable(arg):
+    if type(arg) is tuple:
         raise TypeError(f"{msg} Got {arg!r:.100}.")
     return arg
 
diff --git a/Misc/NEWS.d/next/Library/2022-02-05-22-14-44.bpo-46644.P--1Cz.rst b/Misc/NEWS.d/next/Library/2022-02-05-22-14-44.bpo-46644.P--1Cz.rst
new file mode 100644
index 0000000000000..25a999fac8d37
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-02-05-22-14-44.bpo-46644.P--1Cz.rst
@@ -0,0 +1 @@
+No longer require valid typeforms to be callable. This allows :data:`typing.Annotated` to wrap :data:`typing.ParamSpecArgs` and :data:`dataclasses.InitVar`. Patch by Gregory Beauregard.



More information about the Python-checkins mailing list