@@ -2338,3 +2338,127 @@ reveal_type(handle_reversed(Child())) # N: Revealed type is "builtins.str"
2338
2338
reveal_type(handle_reversed(NotChild())) # N: Revealed type is "builtins.str"
2339
2339
2340
2340
[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