class_docstr: Resolver objects handle the process of looking up actual names and types.
  
  Unless noted otherwise, all resolve_* methods:
    * have a first namespace argument, mapping string to actual values
    * have a second types_namespace argument, mapping string to actual inferred
      types
    * specify names as QN objects
    * specify types as a Set of inferred types
  
  Unless noted otherwise, all resolve_* methods must return either:
    * a set of `type` objects
    * None
class_docstr_tok: ["Resolver","objects","handle","the","process","of","looking","up","actual","names","and","types",".","Unless","noted","otherwise",",","all","resolve_","*","methods",":","*","have","a","first","namespace","argument",",","mapping","string","to","actual","values","*","have","a","second","types_namespace","argument",",","mapping","string","to","actual","inferred","types","*","specify","names","as","QN","objects","*","specify","types","as","a","Set","of","inferred","types","Unless","noted","otherwise",",","all","resolve_","*","methods","must","return","either",":","*","a","set","of","`","type","`","objects","*","None"]
docstr: Resolves the return type an external function or method call.
  
  Args:
    ns: namespace
    types_ns: types namespace
    node: str, the function name
    f_type: types of the actual function being called, if known
    args: types of each respective argument in node.args
    keywords: types of each respective argument in node.keywords
  
  Returns:
    Tuple (return_type, side_effect_types). The first element is just the
    return types of the function. The second element is a map from
    argument names to sets of types, and allow modelling side effects of
    functions (for example via global or nonlocal).
docstr_tok: ["Resolves","the","return","type","an","external","function","or","method","call",".","Args",":","ns",":","namespace","types_ns",":","types","namespace","node",":","str",",","the","function","name","f_type",":","types","of","the","actual","function","being","called",",","if","known","args",":","types","of","each","respective","argument","in","node.args","keywords",":","types","of","each","respective","argument","in","node.keywords","Returns",":","Tuple","(","return_type",",","side_effect_types",")",".","The","first","element","is","just","the","return","types","of","the","function",".","The","second","element","is","a","map","from","argument","names","to","sets","of","types",",","and","allow","modelling","side","effects","of","functions","(","for","example","via","global","or","nonlocal",")","."]
code: def res_call(self, ns, types_ns, node, f_type, args, keywords):
      """Resolves the return type an external function or method call.
  
      Args:
        ns: namespace
        types_ns: types namespace
        node: str, the function name
        f_type: types of the actual function being called, if known
        args: types of each respective argument in node.args
        keywords: types of each respective argument in node.keywords
  
      Returns:
        Tuple (return_type, side_effect_types). The first element is just the
        return types of the function. The second element is a map from
        argument names to sets of types, and allow modelling side effects of
        functions (for example via global or nonlocal).
      """
      raise NotImplementedError("subclasses must implement")
  
imports: import itertools
  from typing import Any, Callable, Dict, Set
  import gast
  from nvidia.dali._autograph.pyct import anno
  from nvidia.dali._autograph.pyct import cfg
  from nvidia.dali._autograph.pyct import qual_names
  from nvidia.dali._autograph.pyct import transformer
  from nvidia.dali._autograph.pyct.static_analysis import activity
  from nvidia.dali._autograph.pyct.static_analysis import annos
label_desc: Use image node_id 4 for calling the Resolver obj's underlying member method code with example usage: obj.res_call(ns, types_ns, node, f_type, args, keywords) without return types