code: def Expand(self, obj, path):
      
      if isinstance(path, py2to3.STRING_TYPES):
        path = path.split(self.FIELD_SEPARATOR)
  
      attr_name = self._GetAttributeName(path)
      attr_value = self._GetValue(obj, attr_name)
      if attr_value is None:
        return
  
      if len(path) == 1:
        for value in self._AtLeaf(attr_value):
          yield value
      else:
        for value in self._AtNonLeaf(attr_value, path):
          yield value
docs: Returns a list of all the values for the given path in the object obj.
  
      Given a path such as ["sub1", "sub2"] it returns all the values available
      in obj.sub1.sub2 as a list. sub1 and sub2 must be data attributes or
      properties.
  
      If sub1 returns a list of objects, or a generator, Expand aggregates the
      values for the remaining path for each of the objects, thus returning a
      list of all the values under the given path for the input object.
  
      Args:
        obj: An object that will be traversed for the given path
        path: A list of strings
  
      Yields:
        The values once the object is traversed.