self.assertEqual(repr(P.args), "P.args")
self.assertEqual(repr(P.kwargs), "P.kwargs")
+ def test_stringized(self):
+ P = ParamSpec('P')
+ class C(Generic[P]):
+ func: Callable["P", int]
+ def foo(self, *args: "P.args", **kwargs: "P.kwargs"):
+ pass
+
+ self.assertEqual(gth(C, globals(), locals()), {"func": Callable[P, int]})
+ self.assertEqual(
+ gth(C.foo, globals(), locals()), {"args": P.args, "kwargs": P.kwargs}
+ )
+
def test_user_generics(self):
T = TypeVar("T")
P = ParamSpec("P")
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)):
+ if isinstance(arg, (type, TypeVar, ForwardRef, types.UnionType, ParamSpec,
+ ParamSpecArgs, ParamSpecKwargs)):
return arg
if not callable(arg):
raise TypeError(f"{msg} Got {arg!r:.100}.")
--- /dev/null
+In :func:`typing.get_type_hints`, support evaluating stringified ``ParamSpecArgs`` and ``ParamSpecKwargs`` annotations. Patch by Gregory Beauregard.
\ No newline at end of file