From: Gregory Beauregard Date: Sat, 12 Mar 2022 01:12:17 +0000 (-0800) Subject: bpo-46644: Remove callable() requirement from typing._type_check (GH-31151) X-Git-Tag: v3.11.0a7~270 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=870b22b9c442d035190d2b8fb82256cd9a03da48;p=thirdparty%2FPython%2Fcpython.git bpo-46644: Remove callable() requirement from typing._type_check (GH-31151) We also remove all the tests that check for integer literals. --- diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index b8b1ce96f93c..f8b239117f51 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -875,7 +875,7 @@ class UnionTests(unittest.TestCase): 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 a6936653bc56..c619042928bb 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -345,7 +345,7 @@ class TypeVarTests(BaseTestCase): 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 @@ class GenericTests(BaseTestCase): 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 GenericTests(BaseTestCase): 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 @@ class ForwardRefTests(BaseTestCase): 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 @@ class NamedTupleTests(BaseTestCase): 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 @@ class NamedTupleTests(BaseTestCase): 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 @@ class TypedDictTests(BaseTestCase): 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 @@ class TypedDictTests(BaseTestCase): 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 @@ class TypeGuardTests(BaseTestCase): 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 842554f193ca..dd68e71db155 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 000000000000..25a999fac8d3 --- /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.