@@ -2338,3 +2338,127 @@ reveal_type(handle_reversed(Child())) # N: Revealed type is "builtins.str"
23382338reveal_type(handle_reversed(NotChild())) # N: Revealed type is "builtins.str"
23392339
23402340[builtins fixtures/paramspec.pyi]
2341+
2342+ [case testBindPartial]
2343+ from functools import partial
2344+ from typing_extensions import ParamSpec
2345+ from typing import Callable, TypeVar
2346+
2347+ P = ParamSpec("P")
2348+ T = TypeVar("T")
2349+
2350+ def run(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2351+ func2 = partial(func, **kwargs)
2352+ return func2(*args)
2353+
2354+ def run2(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2355+ func2 = partial(func, *args)
2356+ return func2(**kwargs)
2357+
2358+ def run3(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2359+ func2 = partial(func, *args, **kwargs)
2360+ return func2()
2361+
2362+ def run4(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2363+ func2 = partial(func, *args, **kwargs)
2364+ return func2(**kwargs)
2365+
2366+ def run_bad(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2367+ func2 = partial(func, *args, **kwargs)
2368+ return func2(*args) # E: Too many arguments
2369+
2370+ def run_bad2(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2371+ func2 = partial(func, **kwargs)
2372+ return func2(**kwargs) # E: Too few arguments
2373+
2374+ def run_bad3(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
2375+ func2 = partial(func, *args)
2376+ return func2() # E: Too few arguments
2377+
2378+ [builtins fixtures/paramspec.pyi]
2379+
2380+ [case testBindPartialConcatenate]
2381+ from functools import partial
2382+ from typing_extensions import Concatenate, ParamSpec
2383+ from typing import Callable, TypeVar
2384+
2385+ P = ParamSpec("P")
2386+ T = TypeVar("T")
2387+
2388+ def run(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2389+ func2 = partial(func, 1, **kwargs)
2390+ return func2(*args)
2391+
2392+ def run2(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2393+ func2 = partial(func, **kwargs)
2394+ p = [""]
2395+ func2(1, *p) # E: Too few arguments \
2396+ # E: Argument 2 has incompatible type "*List[str]"; expected "P.args"
2397+ func2(1, 2, *p) # E: Too few arguments \
2398+ # E: Argument 2 has incompatible type "int"; expected "P.args" \
2399+ # E: Argument 3 has incompatible type "*List[str]"; expected "P.args"
2400+ func2(1, *args, *p) # E: Argument 3 has incompatible type "*List[str]"; expected "P.args"
2401+ func2(1, *p, *args) # E: Argument 2 has incompatible type "*List[str]"; expected "P.args"
2402+ return func2(1, *args)
2403+
2404+ def run3(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2405+ func2 = partial(func, 1, *args)
2406+ d = {"":""}
2407+ func2(**d) # E: Too few arguments \
2408+ # E: Argument 1 has incompatible type "**Dict[str, str]"; expected "P.kwargs"
2409+ return func2(**kwargs)
2410+
2411+ def run4(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2412+ func2 = partial(func, 1)
2413+ return func2(*args, **kwargs)
2414+
2415+ def run5(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2416+ func2 = partial(func, 1, *args, **kwargs)
2417+ func2()
2418+ return func2(**kwargs)
2419+
2420+ def run_bad(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2421+ func2 = partial(func, *args) # E: Argument 1 has incompatible type "*P.args"; expected "int"
2422+ return func2(1, **kwargs) # E: Argument 1 has incompatible type "int"; expected "P.args"
2423+
2424+ def run_bad2(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2425+ func2 = partial(func, 1, *args)
2426+ func2() # E: Too few arguments
2427+ func2(*args, **kwargs) # E: Too many arguments
2428+ return func2(1, **kwargs) # E: Argument 1 has incompatible type "int"; expected "P.args"
2429+
2430+ def run_bad3(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2431+ func2 = partial(func, 1, **kwargs)
2432+ func2() # E: Too few arguments
2433+ return func2(1, *args) # E: Argument 1 has incompatible type "int"; expected "P.args"
2434+
2435+ def run_bad4(func: Callable[Concatenate[int, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2436+ func2 = partial(func, 1)
2437+ func2() # E: Too few arguments
2438+ func2(*args) # E: Too few arguments
2439+ func2(1, *args) # E: Too few arguments \
2440+ # E: Argument 1 has incompatible type "int"; expected "P.args"
2441+ func2(1, **kwargs) # E: Too few arguments \
2442+ # E: Argument 1 has incompatible type "int"; expected "P.args"
2443+ return func2(**kwargs) # E: Too few arguments
2444+
2445+ [builtins fixtures/paramspec.pyi]
2446+
2447+ [case testOtherVarArgs]
2448+ from functools import partial
2449+ from typing_extensions import Concatenate, ParamSpec
2450+ from typing import Callable, TypeVar, Tuple
2451+
2452+ P = ParamSpec("P")
2453+ T = TypeVar("T")
2454+
2455+ def run(func: Callable[Concatenate[int, str, P], T], *args: P.args, **kwargs: P.kwargs) -> T:
2456+ func2 = partial(func, **kwargs)
2457+ args_prefix: Tuple[int, str] = (1, 'a')
2458+ func2(*args_prefix) # E: Too few arguments
2459+ func2(*args, *args_prefix) # E: Argument 1 has incompatible type "*P.args"; expected "int" \
2460+ # E: Argument 1 has incompatible type "*P.args"; expected "str" \
2461+ # E: Argument 2 has incompatible type "*Tuple[int, str]"; expected "P.args"
2462+ return func2(*args_prefix, *args)
2463+
2464+ [builtins fixtures/paramspec.pyi]
0 commit comments