code: def read(self, run, attr):
      run_data = self._data.get(run.id)
      if run_data is None:
          # Require a refresh as an indication user wants run attrs.
          return None
      try:
          return run_data[attr]
      except KeyError:
          # Fallback on run to support all run attributes
          return run.get(attr)
  
imports: import logging
  import os
  import sqlite3
  from guild import run_util
  from guild import tfevent
  from guild import util
  from guild import var
label_desc: Use image node_id 3 for calling the AttrReader obj's underlying member method code with example usage: obj.read(run, attr) and returns: None, run_data, run