2525 GetAnnotations ,
2626 GetArg ,
2727 GetArgs ,
28+ GetMember ,
2829 GetMemberType ,
2930 InitField ,
3031 IsSubSimilar ,
@@ -657,19 +658,20 @@ def _get_function_hint_namespaces(func, receiver_type=None):
657658 return globalns , localns
658659
659660
661+ def _hint_to_member (n , t , qs , init , d , * , ctx ):
662+ return Member [
663+ typing .Literal [n ],
664+ _eval_types (t , ctx ),
665+ _mk_literal_union (* qs ),
666+ init ,
667+ d ,
668+ ]
669+
670+
660671def _hints_to_members (hints , ctx ):
661672 """Convert a hints dictionary to a tuple of Member types."""
662673 return tuple [
663- * [
664- Member [
665- typing .Literal [n ],
666- _eval_types (t , ctx ),
667- _mk_literal_union (* qs ),
668- init ,
669- d ,
670- ]
671- for n , (t , qs , init , d ) in hints .items ()
672- ]
674+ * [_hint_to_member (n , * hint , ctx = ctx ) for n , hint in hints .items ()]
673675 ]
674676
675677
@@ -690,6 +692,21 @@ def _eval_Members(tp, *, ctx):
690692 return _hints_to_members (hints , ctx )
691693
692694
695+ @type_eval .register_evaluator (GetMember )
696+ @_lift_over_unions
697+ def _eval_GetMember (tp , prop , * , ctx ):
698+ # XXX: extras?
699+ name = _from_literal (prop )
700+ hints = {
701+ ** get_annotated_type_hints (tp , include_extras = True ),
702+ ** get_annotated_method_hints (tp ),
703+ }
704+ if name in hints :
705+ return _hint_to_member (name , * hints [name ], ctx = ctx )
706+ else :
707+ return typing .Never
708+
709+
693710##################################################################
694711
695712
0 commit comments