code: def iter_node(node, name='', unknown=None,
                # Runtime optimization
                list=list, getattr=getattr, isinstance=isinstance,
                enumerate=enumerate, missing=NonExistent):
      
      fields = getattr(node, '_fields', None)
      if fields is not None:
          for name in fields:
              value = getattr(node, name, missing)
              if value is not missing:
                  yield value, name
          if unknown is not None:
              unknown.update(set(vars(node)) - set(fields))
      elif isinstance(node, list):
          for value in node:
              yield value, name
docs: Iterates over an object:
  
         - If the object has a _fields attribute,
           it gets attributes in the order of this
           and returns name, value pairs.
  
         - Otherwise, if the object is a list instance,
           it returns name, value pairs for each item
           in the list, where the name is passed into
           this function (defaults to blank).
  
         - Can update an unknown set with information about
           attributes that do not exist in fields.