Skip to content

Commit ec9a00d

Browse files
committed
Address review comments
1 parent 229a087 commit ec9a00d

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

crates/ty_python_semantic/resources/mdtest/generics/pep695/concatenate.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
264269
def 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`
402407
reveal_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
423440
reveal_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

428472
A function that accepts an overloaded callable via `Callable[Concatenate[int, P], R]` should be able

crates/ty_python_semantic/resources/mdtest/type_properties/is_assignable_to.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,7 +1513,8 @@ class Child(Parent): ...
15131513

15141514
static_assert(is_assignable_to(Callable[Concatenate[Parent, ...], None], Callable[Concatenate[Child, ...], None]))
15151515
# TODO: should not be assignable (`Parent` is not assignable to `Child`)
1516-
static_assert(is_assignable_to(Callable[Concatenate[Child, ...], None], Callable[Concatenate[Parent, ...], None]))
1516+
# error: [static-assert-error]
1517+
static_assert(not is_assignable_to(Callable[Concatenate[Child, ...], None], Callable[Concatenate[Parent, ...], None]))
15171518
```
15181519

15191520
### Different parameter types
@@ -1526,9 +1527,11 @@ class A: ...
15261527
class B: ...
15271528

15281529
# TODO: should not be assignable (`A` and `B` are disjoint)
1529-
static_assert(is_assignable_to(Callable[Concatenate[A, ...], None], Callable[Concatenate[B, ...], None]))
1530+
# error: [static-assert-error]
1531+
static_assert(not is_assignable_to(Callable[Concatenate[A, ...], None], Callable[Concatenate[B, ...], None]))
15301532
# TODO: should not be assignable
1531-
static_assert(is_assignable_to(Callable[Concatenate[B, ...], None], Callable[Concatenate[A, ...], None]))
1533+
# error: [static-assert-error]
1534+
static_assert(not is_assignable_to(Callable[Concatenate[B, ...], None], Callable[Concatenate[A, ...], None]))
15321535
```
15331536

15341537
### Different number of prepended parameters

0 commit comments

Comments
 (0)