@@ -260,6 +260,11 @@ def decorator[**P](func: Callable[Concatenate[int, P], bool]) -> Callable[P, boo
260260 # TODO : no error expected here
261261 return wrapper # error: [invalid-return-type]
262262
263+ # TODO : This should be an error because the required `int` parameter is missing
264+ @decorator
265+ def f0 () -> bool :
266+ return True
267+
263268@decorator
264269def f1 (a : int ) -> bool :
265270 return True
@@ -400,6 +405,18 @@ def variadic(x: int, *args: str, **kwargs: int) -> None: ...
400405
401406# TODO : Should reveal `(*args: str, **kwargs: int) -> None`
402407reveal_type(variadic) # revealed: [**P'return](**P'return) -> None
408+
409+ @decorator
410+ def only_variadic (* args : str , ** kwargs : int ) -> None : ...
411+
412+ # TODO : Should reveal `(*args: str, **kwargs: int) -> None`
413+ reveal_type(only_variadic) # revealed: [**P'return](**P'return) -> None
414+
415+ @decorator
416+ def unpack_variadic (* args : * tuple[int , * tuple[str , ... ]], ** kwargs : int ) -> None : ...
417+
418+ # TODO : should reveal `(*args: str, **kwargs: int) -> None`
419+ reveal_type(unpack_variadic) # revealed: [**P'return](**P'return) -> None
403420```
404421
405422## ` Concatenate ` with ` ParamSpec ` in generic function calls
@@ -423,6 +440,33 @@ reveal_type(foo(test, 1, "")) # revealed: bool
423440reveal_type(foo(test, " " )) # revealed: bool
424441```
425442
443+ ### Prepended type variable
444+
445+ ``` py
446+ from typing import Callable, Concatenate
447+
448+ def decorator[T, R, ** P](func: Callable[Concatenate[T, P], R], * args: P.args, ** kwargs: P.kwargs) -> Callable[[T], R]:
449+ def wrapper (arg : T, / ) -> R:
450+ return func(arg, * args, ** kwargs)
451+ return wrapper
452+
453+ @decorator
454+ def test1 (x : str , y : str ) -> bool :
455+ return True
456+
457+ # TODO : should reveal (str, /) -> bool
458+ reveal_type(test1) # revealed: [T'return](T'return, /) -> bool
459+ reveal_type(test1(" " )) # revealed: bool
460+ # error: [too-many-positional-arguments]
461+ reveal_type(test1(" " , " " )) # revealed: bool
462+
463+ # TODO : This should be an error since a keyword-only parameter cannot be assigned to positional-only
464+ # parameter `T`
465+ @decorator
466+ def test2 (* , x : int ) -> bool :
467+ return True
468+ ```
469+
426470## ` Concatenate ` with overloaded functions
427471
428472A function that accepts an overloaded callable via ` Callable[Concatenate[int, P], R] ` should be able
0 commit comments