class_docstr: Data that must be available at all points during query execution.
  
  Namely, schema of the type system that is currently executing,
  and the fragments defined in the query document
class_docstr_tok: ["Data","that","must","be","available","at","all","points","during","query","execution",".","Namely",",","schema","of","the","type","system","that","is","currently","executing",",","and","the","fragments","defined","in","the","query","document"]
code: def get_sub_fields(self, return_type, field_asts):
      k = return_type, tuple(field_asts)
      if k not in self._subfields_cache:
          subfield_asts = DefaultOrderedDict(list)
          visited_fragment_names = set()
          for field_ast in field_asts:
              selection_set = field_ast.selection_set
              if selection_set:
                  subfield_asts = collect_fields(
                      self,
                      return_type,
                      selection_set,
                      subfield_asts,
                      visited_fragment_names,
                  )
          self._subfields_cache[k] = subfield_asts
      return self._subfields_cache[k]
  
imports: from ..error import GraphQLError
  from ..language import ast
  from ..pyutils.default_ordered_dict import DefaultOrderedDict
  from ..type.definition import GraphQLInterfaceType, GraphQLUnionType
  from ..type.directives import GraphQLIncludeDirective, GraphQLSkipDirective
  from ..type.introspection import SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef
  from ..utils.type_from_ast import type_from_ast
  from .values import get_argument_values, get_variable_values
label_desc: Use image node_id 4 for calling the ExecutionContext obj's underlying member method code with example usage: obj.get_sub_fields(return_type, field_asts) and returns: self