parameters: (self, name, location=None)
return_statement: return result
docstring: Resolve a dotted name against the current context stack.
  
          This function follows the rules outlined in the section of the
          spec regarding tag interpolation.  This function returns the value
          as is and does not coerce the return value to a string.
  
          Arguments:
  
            name: a dotted or non-dotted name.
  
            default: the value to return if name resolution fails at any point.
              Defaults to the empty string per the Mustache spec.
  
          This method queries items in the stack in order from last-added
          objects to first (last in, first out).  The value returned is
          the value of the key in the first item that contains the key.
          If the key is not found in any item in the stack, then the default
          value is returned.  The default value defaults to None.
  
          In accordance with the spec, this method queries items in the
          stack for a key differently depending on whether the item is a
          hash, object, or neither (as defined in the module docstring):
  
          (1) Hash: if the item is a hash, then the key's value is the
              dictionary value of the key.  If the dictionary doesn't contain
              the key, then the key is considered not found.
  
          (2) Object: if the item is an an object, then the method looks for
              an attribute with the same name as the key.  If an attribute
              with that name exists, the value of the attribute is returned.
              If the attribute is callable, however (i.e. if the attribute
              is a method), then the attribute is called with no arguments
              and that value is returned.  If there is no attribute with
              the same name as the key, then the key is considered not found.
  
          (3) Neither: if the item is neither a hash nor an object, then
              the key is considered not found.
  
          *Caution*:
  
            Callables are handled differently depending on whether they are
            dictionary values, as in (1) above, or attributes, as in (2).
            The former are returned as-is, while the latter are first
            called and that value returned.
  
            Here is an example to illustrate:
  
            >>> def greet():
            ...     return "Hi Bob!"
            >>>
            >>> class Greeter(object):
            ...     greet = None
            >>>
            >>> dct = {'greet': greet}
            >>> obj = Greeter()
            >>> obj.greet = greet
            >>>
            >>> dct['greet'] is obj.greet
            True
            >>> ContextStack(dct).get('greet')  #doctest: +ELLIPSIS
            <function greet at 0x...>
            >>> ContextStack(obj).get('greet')
            'Hi Bob!'
  
            TODO: explain the rationale for this difference in treatment.
docstring_summary: Resolve a dotted name against the current context stack.
docstring_tokens: Resolve a dotted name against the current context stack .
function: def get(self, name, location=None):
          """
          Resolve a dotted name against the current context stack.
  
          This function follows the rules outlined in the section of the
          spec regarding tag interpolation.  This function returns the value
          as is and does not coerce the return value to a string.
  
          Arguments:
  
            name: a dotted or non-dotted name.
  
            default: the value to return if name resolution fails at any point.
              Defaults to the empty string per the Mustache spec.
  
          This method queries items in the stack in order from last-added
          objects to first (last in, first out).  The value returned is
          the value of the key in the first item that contains the key.
          If the key is not found in any item in the stack, then the default
          value is returned.  The default value defaults to None.
  
          In accordance with the spec, this method queries items in the
          stack for a key differently depending on whether the item is a
          hash, object, or neither (as defined in the module docstring):
  
          (1) Hash: if the item is a hash, then the key's value is the
              dictionary value of the key.  If the dictionary doesn't contain
              the key, then the key is considered not found.
  
          (2) Object: if the item is an an object, then the method looks for
              an attribute with the same name as the key.  If an attribute
              with that name exists, the value of the attribute is returned.
              If the attribute is callable, however (i.e. if the attribute
              is a method), then the attribute is called with no arguments
              and that value is returned.  If there is no attribute with
              the same name as the key, then the key is considered not found.
  
          (3) Neither: if the item is neither a hash nor an object, then
              the key is considered not found.
  
          *Caution*:
  
            Callables are handled differently depending on whether they are
            dictionary values, as in (1) above, or attributes, as in (2).
            The former are returned as-is, while the latter are first
            called and that value returned.
  
            Here is an example to illustrate:
  
            >>> def greet():
            ...     return "Hi Bob!"
            >>>
            >>> class Greeter(object):
            ...     greet = None
            >>>
            >>> dct = {'greet': greet}
            >>> obj = Greeter()
            >>> obj.greet = greet
            >>>
            >>> dct['greet'] is obj.greet
            True
            >>> ContextStack(dct).get('greet')  #doctest: +ELLIPSIS
            <function greet at 0x...>
            >>> ContextStack(obj).get('greet')
            'Hi Bob!'
  
            TODO: explain the rationale for this difference in treatment.
  
          """
          if name == '.':
              try:
                  return self.top()
              except IndexError:
                  raise KeyNotFoundError(".", "empty context stack", location)
  
          parts = name.split('.')
  
          try:
              result = self._get_simple(parts[0], location)
          except KeyNotFoundError:
              raise KeyNotFoundError(name, "first part", location)
  
          for part in parts[1:]:
              # The full context stack is not used to resolve the remaining parts.
              # From the spec--
              #
              #   5) If any name parts were retained in step 1, each should be
              #   resolved against a context stack containing only the result
              #   from the former resolution.  If any part fails resolution, the
              #   result should be considered falsey, and should interpolate as
              #   the empty string.
              #
              # TODO: make sure we have a test case for the above point.
              result = _get_value(result, part)
              # TODO: consider using EAFP here instead.
              #   http://docs.python.org/glossary.html#term-eafp
              if result is _NOT_FOUND:
                  raise KeyNotFoundError(name, "missing %s" % repr(part), location)
  
          return result
function_tokens: def get ( self , name , location = None ) : if name == '.' : try : return self . top ( ) except IndexError : raise KeyNotFoundError ( "." , "empty context stack" , location ) parts = name . split ( '.' ) try : result = self . _get_simple ( parts [ 0 ] , location ) except KeyNotFoundError : raise KeyNotFoundError ( name , "first part" , location ) for part in parts [ 1 : ] : # The full context stack is not used to resolve the remaining parts. # From the spec-- # #   5) If any name parts were retained in step 1, each should be #   resolved against a context stack containing only the result #   from the former resolution.  If any part fails resolution, the #   result should be considered falsey, and should interpolate as #   the empty string. # # TODO: make sure we have a test case for the above point. result = _get_value ( result , part ) # TODO: consider using EAFP here instead. #   http://docs.python.org/glossary.html#term-eafp if result is _NOT_FOUND : raise KeyNotFoundError ( name , "missing %s" % repr ( part ) , location ) return result