1313 Tuple ,
1414 TypeVar ,
1515 Union ,
16+ get_args ,
1617)
1718
1819import pytest
2728 GenericCallable ,
2829 GetArg ,
2930 GetArgs ,
31+ GetDefiner ,
3032 GetMember ,
3133 GetMemberType ,
3234 GetName ,
35+ GetQuals ,
3336 GetSpecialAttr ,
3437 GetType ,
3538 GetAnnotations ,
@@ -394,6 +397,56 @@ def test_getmember_01():
394397 assert d == Never
395398
396399
400+ def test_getmember_02 ():
401+ type OnlyIntToSet [T ] = set [T ] if IsSub [T , int ] else T
402+
403+ class C :
404+ def f [T ](self , x : T ) -> OnlyIntToSet [T ]: ...
405+
406+ m = eval_typing (GetMember [C , Literal ["f" ]])
407+ assert eval_typing (GetName [m ]) == Literal ["f" ]
408+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
409+ assert eval_typing (GetDefiner [m ]) == C
410+
411+ t = eval_typing (GetType [m ])
412+ Vs = get_args (get_args (t )[0 ])
413+ L = get_args (t )[1 ]
414+ f = L (* Vs )
415+ assert (
416+ f
417+ == Callable [
418+ [Param [Literal ["self" ], C ], Param [Literal ["x" ], Vs [0 ]]],
419+ OnlyIntToSet [Vs [0 ]],
420+ ]
421+ )
422+
423+
424+ def test_getmember_03 ():
425+ type OnlyIntToSet [T ] = set [T ] if IsSub [T , int ] else T
426+
427+ class C :
428+ def f [T ](self , x : T ) -> OnlyIntToSet [T ]: ...
429+
430+ type P = IndirectProtocol [C ]
431+
432+ m = eval_typing (GetMember [P , Literal ["f" ]])
433+ assert eval_typing (GetName [m ]) == Literal ["f" ]
434+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
435+ assert eval_typing (GetDefiner [m ]) != C # eval typing generates a new class
436+
437+ t = eval_typing (GetType [m ])
438+ Vs = get_args (get_args (t )[0 ])
439+ L = get_args (t )[1 ]
440+ f = L (* Vs )
441+ assert (
442+ f
443+ == Callable [
444+ [Param [Literal ["self" ], Self ], Param [Literal ["x" ], Vs [0 ]]],
445+ OnlyIntToSet [Vs [0 ]],
446+ ]
447+ )
448+
449+
397450def test_getarg_never ():
398451 d = eval_typing (GetArg [Never , object , Literal [0 ]])
399452 assert d is Never
@@ -480,11 +533,7 @@ def test_eval_getarg_callable_02():
480533 t = eval_typing (GetArg [gc , GenericCallable , Literal [0 ]])
481534 assert t == tuple [T ]
482535 gc_f = eval_typing (GetArg [gc , GenericCallable , Literal [1 ]])
483- assert gc_f == f
484- t = eval_typing (GetArg [gc_f , Callable , Literal [0 ]])
485- assert t == tuple [Param [Literal [None ], T , Never ]]
486- t = eval_typing (GetArg [gc_f , Callable , Literal [1 ]])
487- assert t is T
536+ assert gc_f == Never
488537
489538 # Params wrapped
490539 f = Callable [
@@ -502,7 +551,7 @@ def test_eval_getarg_callable_02():
502551 t = eval_typing (GetArg [gc , GenericCallable , Literal [0 ]])
503552 assert t == tuple [T ]
504553 gc_f = eval_typing (GetArg [gc , GenericCallable , Literal [1 ]])
505- assert gc_f == f
554+ assert gc_f == Never
506555
507556
508557type IndirectProtocol [T ] = NewProtocol [* [m for m in Iter [Members [T ]]],]
@@ -650,18 +699,7 @@ def f[T](self, x: T, /, y: T, *, z: T) -> T: ...
650699 GetArg [GetArg [gc , GenericCallable , Literal [0 ]], tuple , Literal [0 ]]
651700 )
652701 f = eval_typing (GetArg [gc , GenericCallable , Literal [1 ]])
653- t = eval_typing (GetArg [f , Callable , Literal [0 ]])
654- assert (
655- t
656- == tuple [
657- Param [Literal ["self" ], C , Literal ["positional" ]],
658- Param [Literal ["x" ], _T , Literal ["positional" ]],
659- Param [Literal ["y" ], _T ],
660- Param [Literal ["z" ], _T , Literal ["keyword" ]],
661- ]
662- )
663- t = eval_typing (GetArg [f , Callable , Literal [1 ]])
664- assert t is _T
702+ assert f is Never
665703
666704
667705def test_eval_getarg_callable_08 ():
@@ -675,19 +713,7 @@ def f[T](cls, x: T, /, y: T, *, z: T) -> T: ...
675713 GetArg [GetArg [gc , GenericCallable , Literal [0 ]], tuple , Literal [0 ]]
676714 )
677715 f = eval_typing (GetArg [gc , GenericCallable , Literal [1 ]])
678- t = eval_typing (GetArg [f , classmethod , Literal [0 ]])
679- assert t is C
680- t = eval_typing (GetArg [f , classmethod , Literal [1 ]])
681- assert (
682- t
683- == tuple [
684- Param [Literal ["x" ], _T , Literal ["positional" ]],
685- Param [Literal ["y" ], _T ],
686- Param [Literal ["z" ], _T , Literal ["keyword" ]],
687- ]
688- )
689- t = eval_typing (GetArg [f , classmethod , Literal [2 ]])
690- assert t is _T
716+ assert f is Never
691717
692718
693719def test_eval_getarg_callable_09 ():
@@ -701,17 +727,7 @@ def f[T](x: T, /, y: T, *, z: T) -> T: ...
701727 GetArg [GetArg [gc , GenericCallable , Literal [0 ]], tuple , Literal [0 ]]
702728 )
703729 f = eval_typing (GetArg [gc , GenericCallable , Literal [1 ]])
704- t = eval_typing (GetArg [f , staticmethod , Literal [0 ]])
705- assert (
706- t
707- == tuple [
708- Param [Literal ["x" ], _T , Literal ["positional" ]],
709- Param [Literal ["y" ], _T ],
710- Param [Literal ["z" ], _T , Literal ["keyword" ]],
711- ]
712- )
713- t = eval_typing (GetArg [f , staticmethod , Literal [1 ]])
714- assert t is _T
730+ assert f is Never
715731
716732
717733def test_eval_getarg_tuple ():
@@ -989,6 +1005,15 @@ class Container2[T]: ...
9891005 assert eval_typing (GetArg [t , Container , Literal [1 ]]) == Never
9901006
9911007
1008+ def test_eval_getargs_generic_callable_01 ():
1009+ T = TypeVar ("T" )
1010+ t = GenericCallable [
1011+ tuple [T ], lambda T : Callable [[Param [Literal ["x" ], T ]], int ]
1012+ ]
1013+ args = eval_typing (GetArgs [t , GenericCallable ])
1014+ assert args == tuple [tuple [T ]]
1015+
1016+
9921017class OuterType :
9931018 class InnerType :
9941019 pass
0 commit comments