Skip to content

Commit 7606270

Browse files
authored
Allow ParamSpecArgs to be unpacked (#13459)
1 parent 5f488e2 commit 7606270

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

mypy/checker.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@
194194
TypeTranslator,
195195
TypeType,
196196
TypeVarId,
197+
TypeVarLikeType,
197198
TypeVarType,
198199
UnboundType,
199200
UninhabitedType,
@@ -3161,7 +3162,7 @@ def check_multi_assignment(
31613162
# TODO: maybe elsewhere; redundant.
31623163
rvalue_type = get_proper_type(rv_type or self.expr_checker.accept(rvalue))
31633164

3164-
if isinstance(rvalue_type, TypeVarType):
3165+
if isinstance(rvalue_type, TypeVarLikeType):
31653166
rvalue_type = get_proper_type(rvalue_type.upper_bound)
31663167

31673168
if isinstance(rvalue_type, UnionType):

test-data/unit/check-parameter-specification.test

+20
Original file line numberDiff line numberDiff line change
@@ -1092,3 +1092,23 @@ def func(callback: Callable[P, str]) -> Callable[P, str]:
10921092
return 'baz'
10931093
return inner
10941094
[builtins fixtures/paramspec.pyi]
1095+
1096+
[case testUnpackingParamsSpecArgsAndKwargs]
1097+
from typing import Callable
1098+
from typing_extensions import ParamSpec
1099+
1100+
P = ParamSpec("P")
1101+
1102+
def func(callback: Callable[P, str]) -> Callable[P, str]:
1103+
def inner(*args: P.args, **kwargs: P.kwargs) -> str:
1104+
a, *b = args
1105+
reveal_type(a) # N: Revealed type is "builtins.object"
1106+
reveal_type(b) # N: Revealed type is "builtins.list[builtins.object]"
1107+
c, *d = kwargs
1108+
reveal_type(c) # N: Revealed type is "builtins.str"
1109+
reveal_type(d) # N: Revealed type is "builtins.list[builtins.str]"
1110+
e = {**kwargs}
1111+
reveal_type(e) # N: Revealed type is "builtins.dict[builtins.str, builtins.object]"
1112+
return "foo"
1113+
return inner
1114+
[builtins fixtures/paramspec.pyi]

0 commit comments

Comments
 (0)