class_docstr: An AttrTree offers convenient, multi-level attribute access for
  collections of objects. AttrTree objects may also be combined
  together using the update method or merge classmethod. Here is an
  example of adding a ViewableElement to an AttrTree and accessing it:
  
  >>> t = AttrTree()
  >>> t.Example.Path = 1
  >>> t.Example.Path                             #doctest: +ELLIPSIS
  1
class_docstr_tok: ["An","AttrTree","offers","convenient",",","multi-level","attribute","access","for","collections","of","objects",".","AttrTree","objects","may","also","be","combined","together","using","the","update","method","or","merge","classmethod",".","Here","is","an","example","of","adding","a","ViewableElement","to","an","AttrTree","and","accessing","it",":",">",">",">","t","=","AttrTree","(",")",">",">",">","t.Example.Path","=","1",">",">",">","t.Example.Path","#","doctest",":","+ELLIPSIS","1"]
docstr: Propagate the value up to the root node.
docstr_tok: ["Propagate","the","value","up","to","the","root","node","."]
code: def _propagate(self, path, val):
      """
      Propagate the value up to the root node.
      """
      if val == "_DELETE":
          if path in self.data:
              del self.data[path]
          else:
              items = [
                  (key, v)
                  for key, v in self.data.items()
                  if not all(k == p for k, p in zip(key, path))
              ]
              self.data = dict(items)
      else:
          self.data[path] = val
      if self.parent is not None:
          self.parent._propagate((self.identifier,) + path, val)
  
imports: from .None import util
  from .pprint import PrettyPrinter
label_desc: Use image node_id 11 for calling the AttrTree obj's underlying member method code with example usage: obj._propagate(path, val) without return types