code: def eval(self, frame):
      expr = Interpretable(self.expr)
      expr.eval(frame)
      source = "__exprinfo_expr.%s" % self.attrname
      try:
          self.result = frame.eval(source, __exprinfo_expr=expr.result)
      except passthroughex:
          raise
      except:
          raise Failure(self)
      self.explanation = "%s.%s" % (expr.explanation, self.attrname)
      # if the attribute comes from the instance, its value is interesting
      source = (
          'hasattr(__exprinfo_expr, "__dict__") and '
          "%r in __exprinfo_expr.__dict__" % self.attrname
      )
      try:
          from_instance = frame.is_true(
              frame.eval(source, __exprinfo_expr=expr.result)
          )
      except passthroughex:
          raise
      except:
          from_instance = True
      if from_instance:
          r = frame.repr(self.result)
          self.explanation = "%s\n{%s = %s\n}" % (
              r,
              r,
              self.explanation,
          )
  
imports: import py
  import sys, inspect
  from compiler import parse, ast, pycodegen
  from py._code.assertion import BuiltinAssertionError, _format_explanation
  import types
label_desc: Use image node_id 1 for calling the Getattr obj's underlying member method code with example usage: obj.eval(frame) without return types