|
9 | 9 | List, |
10 | 10 | Literal, |
11 | 11 | Never, |
| 12 | + Self, |
12 | 13 | Tuple, |
13 | 14 | TypeVar, |
14 | 15 | Union, |
|
30 | 31 | Iter, |
31 | 32 | Length, |
32 | 33 | Member, |
| 34 | + Members, |
33 | 35 | NewProtocol, |
34 | 36 | Param, |
35 | 37 | SpecialFormEllipsis, |
@@ -137,6 +139,38 @@ class F[bool]: |
137 | 139 | type NestedTree = str | list[NestedTree] | list[IntTree] |
138 | 140 |
|
139 | 141 |
|
| 142 | +def test_eval_types_4(): |
| 143 | + d = eval_typing( |
| 144 | + Callable[ |
| 145 | + [ |
| 146 | + Param[Literal["a"], int, Literal["positional"]], |
| 147 | + Param[Literal["b"], int], |
| 148 | + Param[Literal["c"], int, Literal["default"]], |
| 149 | + Param[None, int, Literal["*"]], |
| 150 | + Param[Literal["d"], int, Literal["keyword"]], |
| 151 | + Param[Literal["e"], int, Literal["default", "keyword"]], |
| 152 | + Param[None, int, Literal["**"]], |
| 153 | + ], |
| 154 | + int, |
| 155 | + ] |
| 156 | + ) |
| 157 | + assert ( |
| 158 | + d |
| 159 | + == Callable[ |
| 160 | + [ |
| 161 | + Param[Literal["a"], int, Literal["positional"]], |
| 162 | + Param[Literal["b"], int], |
| 163 | + Param[Literal["c"], int, Literal["default"]], |
| 164 | + Param[None, int, Literal["*"]], |
| 165 | + Param[Literal["d"], int, Literal["keyword"]], |
| 166 | + Param[Literal["e"], int, Literal["default", "keyword"]], |
| 167 | + Param[None, int, Literal["**"]], |
| 168 | + ], |
| 169 | + int, |
| 170 | + ] |
| 171 | + ) |
| 172 | + |
| 173 | + |
140 | 174 | class TA: |
141 | 175 | x: int |
142 | 176 | y: list[float] |
@@ -381,7 +415,7 @@ def test_eval_getarg_callable_old(): |
381 | 415 | assert args == Any |
382 | 416 |
|
383 | 417 |
|
384 | | -def test_eval_getarg_callable(): |
| 418 | +def test_eval_getarg_callable_01(): |
385 | 419 | t = Callable[[int, str], str] |
386 | 420 | args = eval_typing(GetArg[t, Callable, 0]) |
387 | 421 | assert ( |
@@ -413,6 +447,153 @@ def test_eval_getarg_callable(): |
413 | 447 | assert args == Any |
414 | 448 |
|
415 | 449 |
|
| 450 | +type IndirectProtocol[T] = NewProtocol[*[m for m in Iter[Members[T]]],] |
| 451 | +type GetMethodLike[T, Name] = GetArg[ |
| 452 | + tuple[ |
| 453 | + *[ |
| 454 | + GetType[p] |
| 455 | + for p in Iter[Members[T]] |
| 456 | + if ( |
| 457 | + IsSub[GetType[p], Callable] |
| 458 | + or IsSub[GetType[p], staticmethod] |
| 459 | + or IsSub[GetType[p], classmethod] |
| 460 | + ) |
| 461 | + and IsSub[Name, GetName[p]] |
| 462 | + ], |
| 463 | + ], |
| 464 | + tuple, |
| 465 | + 0, |
| 466 | +] |
| 467 | + |
| 468 | + |
| 469 | +def test_eval_getarg_callable_02a(): |
| 470 | + class C: |
| 471 | + def f(self, x: int, /, y: int, *, z: int) -> int: ... |
| 472 | + |
| 473 | + f = eval_typing(GetMethodLike[C, Literal["f"]]) |
| 474 | + t = eval_typing(GetArg[f, Callable, 0]) |
| 475 | + assert ( |
| 476 | + t |
| 477 | + == tuple[ |
| 478 | + Param[Literal["self"], C, Literal["positional"]], |
| 479 | + Param[Literal["x"], int, Literal["positional"]], |
| 480 | + Param[Literal["y"], int], |
| 481 | + Param[Literal["z"], int, Literal["keyword"]], |
| 482 | + ] |
| 483 | + ) |
| 484 | + t = eval_typing(GetArg[f, Callable, 1]) |
| 485 | + assert t is int |
| 486 | + |
| 487 | + |
| 488 | +def test_eval_getarg_callable_02b(): |
| 489 | + class C: |
| 490 | + def f(self, x: int, /, y: int, *, z: int) -> int: ... |
| 491 | + |
| 492 | + f = eval_typing(GetMethodLike[IndirectProtocol[C], Literal["f"]]) |
| 493 | + t = eval_typing(GetArg[f, Callable, 0]) |
| 494 | + assert ( |
| 495 | + t |
| 496 | + == tuple[ |
| 497 | + Param[Literal["self"], Self, Literal["positional"]], |
| 498 | + Param[Literal["x"], int, Literal["positional"]], |
| 499 | + Param[Literal["y"], int], |
| 500 | + Param[Literal["z"], int, Literal["keyword"]], |
| 501 | + ] |
| 502 | + ) |
| 503 | + t = eval_typing(GetArg[f, Callable, 1]) |
| 504 | + assert t is int |
| 505 | + |
| 506 | + |
| 507 | +def test_eval_getarg_callable_03a(): |
| 508 | + class C: |
| 509 | + @classmethod |
| 510 | + def f(cls, x: int, /, y: int, *, z: int) -> int: ... |
| 511 | + |
| 512 | + f = eval_typing(GetMethodLike[C, Literal["f"]]) |
| 513 | + t = eval_typing(GetArg[f, classmethod, 0]) |
| 514 | + assert t == C |
| 515 | + t = eval_typing(GetArg[f, classmethod, 1]) |
| 516 | + assert ( |
| 517 | + t |
| 518 | + == tuple[ |
| 519 | + Param[Literal["x"], int, Literal["positional"]], |
| 520 | + Param[Literal["y"], int], |
| 521 | + Param[Literal["z"], int, Literal["keyword"]], |
| 522 | + ] |
| 523 | + ) |
| 524 | + t = eval_typing(GetArg[f, classmethod, 2]) |
| 525 | + assert t is int |
| 526 | + |
| 527 | + |
| 528 | +def test_eval_getarg_callable_03b(): |
| 529 | + class C: |
| 530 | + @classmethod |
| 531 | + def f(cls, x: int, /, y: int, *, z: int) -> int: ... |
| 532 | + |
| 533 | + f = eval_typing(GetMethodLike[IndirectProtocol[C], Literal["f"]]) |
| 534 | + t = eval_typing(GetArg[f, Callable, 0]) |
| 535 | + assert ( |
| 536 | + t |
| 537 | + == tuple[ |
| 538 | + Param[Literal["cls"], type[C], Literal["positional"]], |
| 539 | + Param[Literal["x"], int, Literal["positional"]], |
| 540 | + Param[Literal["y"], int], |
| 541 | + Param[Literal["z"], int, Literal["keyword"]], |
| 542 | + ] |
| 543 | + ) |
| 544 | + t = eval_typing(GetArg[f, Callable, 1]) |
| 545 | + assert t is int |
| 546 | + |
| 547 | + |
| 548 | +def test_eval_getarg_callable_04a(): |
| 549 | + class C: |
| 550 | + @staticmethod |
| 551 | + def f(x: int, /, y: int, *, z: int) -> int: ... |
| 552 | + |
| 553 | + f = eval_typing(GetMethodLike[C, Literal["f"]]) |
| 554 | + t = eval_typing(GetArg[f, staticmethod, 0]) |
| 555 | + assert ( |
| 556 | + t |
| 557 | + == tuple[ |
| 558 | + Param[Literal["x"], int, Literal["positional"]], |
| 559 | + Param[Literal["y"], int], |
| 560 | + Param[Literal["z"], int, Literal["keyword"]], |
| 561 | + ] |
| 562 | + ) |
| 563 | + t = eval_typing(GetArg[f, staticmethod, 1]) |
| 564 | + assert t is int |
| 565 | + |
| 566 | + |
| 567 | +def test_eval_getarg_callable_04b(): |
| 568 | + class C: |
| 569 | + @staticmethod |
| 570 | + def f(x: int, /, y: int, *, z: int) -> int: ... |
| 571 | + |
| 572 | + f = eval_typing(GetMethodLike[IndirectProtocol[C], Literal["f"]]) |
| 573 | + t = eval_typing(GetArg[f, Callable, 0]) |
| 574 | + assert ( |
| 575 | + t |
| 576 | + == tuple[ |
| 577 | + Param[Literal["x"], int, Literal["positional"]], |
| 578 | + Param[Literal["y"], int], |
| 579 | + Param[Literal["z"], int, Literal["keyword"]], |
| 580 | + ] |
| 581 | + ) |
| 582 | + t = eval_typing(GetArg[f, Callable, 1]) |
| 583 | + assert t is int |
| 584 | + |
| 585 | + |
| 586 | +def test_eval_getarg_callable_05(): |
| 587 | + class C: |
| 588 | + f: Callable[[int], int] |
| 589 | + |
| 590 | + f = eval_typing(GetMethodLike[IndirectProtocol[C], Literal["f"]]) |
| 591 | + t = eval_typing(GetArg[f, Callable, 0]) |
| 592 | + assert t == tuple[Param[Literal[None], int, Never],] |
| 593 | + t = eval_typing(GetArg[f, Callable, 1]) |
| 594 | + assert t is int |
| 595 | + |
| 596 | + |
416 | 597 | def test_eval_getarg_tuple(): |
417 | 598 | t = tuple[int, ...] |
418 | 599 | args = eval_typing(GetArg[t, tuple, 1]) |
|
0 commit comments