code: def resolve_dotted_attribute(obj, attr, allow_dotted_names=True):
      
  
      if allow_dotted_names:
          attrs = attr.split('.')
      else:
          attrs = [attr]
  
      for i in attrs:
          if i.startswith('_'):
              raise AttributeError(
                  'attempt to access private attribute "%s"' % i
                  )
          else:
              obj = getattr(obj,i)
      return obj
docs: resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d
  
      Resolves a dotted attribute name to an object.  Raises
      an AttributeError if any attribute in the chain starts with a '_'.
  
      If the optional allow_dotted_names argument is false, dots are not
      supported and this function operates similar to getattr(obj, attr).