class_docstr: A dictionary that provides attribute-style access.
  
  >>> b = Munch()
  >>> b.hello = 'world'
  >>> b.hello
  'world'
  >>> b['hello'] += "!"
  >>> b.hello
  'world!'
  >>> b.foo = Munch(lol=True)
  >>> b.foo.lol
  True
  >>> b.foo is b['foo']
  True
  
  A Munch is a subclass of dict; it supports all the methods a dict does...
  
  >>> sorted(b.keys())
  ['foo', 'hello']
  
  Including update()...
  
  >>> b.update({ 'ponies': 'are pretty!' }, hello=42)
  >>> print (repr(b))
  Munch({'ponies': 'are pretty!', 'foo': Munch({'lol': True}), 'hello': 42})
  
  As well as iteration...
  
  >>> sorted([ (k,b[k]) for k in b ])
  [('foo', Munch({'lol': True})), ('hello', 42), ('ponies', 'are pretty!')]
  
  And "splats".
  
  >>> "The {knights} who say {ni}!".format(**Munch(knights='lolcats', ni='can haz'))
  'The lolcats who say can haz!'
  
  See unmunchify/Munch.toDict, munchify/Munch.fromDict for notes about conversion.
docstr: Gets key if it exists, otherwise throws AttributeError.
  
  nb. __getattr__ is only called if key is not found in normal places.
  
  >>> b = Munch(bar='baz', lol={})
  >>> b.foo
  Traceback (most recent call last):
      ...
  AttributeError: foo
  
  >>> b.bar
  'baz'
  >>> getattr(b, 'bar')
  'baz'
  >>> b['bar']
  'baz'
  
  >>> b.lol is b['lol']
  True
  >>> b.lol is getattr(b, 'lol')
  True
docstr_tok: ["Gets","key","if","it","exists",",","otherwise","throws","AttributeError",".","nb",".","__getattr__","is","only","called","if","key","is","not","found","in","normal","places",".",">",">",">","b","=","Munch","(","bar='baz","'",",","lol=","{","}",")",">",">",">","b.foo","Traceback","(","most","recent","call","last",")",":","...","AttributeError",":","foo",">",">",">","b.bar","'baz'",">",">",">","getattr","(","b",",","'bar","'",")","'baz'",">",">",">","b","[","'bar","'","]","'baz'",">",">",">","b.lol","is","b","[","'lol","'","]","True",">",">",">","b.lol","is","getattr","(","b",",","'lol","'",")","True"]
code: def __getattr__(self, k):
      """Gets key if it exists, otherwise throws AttributeError.
  
      nb. __getattr__ is only called if key is not found in normal places.
  
      >>> b = Munch(bar='baz', lol={})
      >>> b.foo
      Traceback (most recent call last):
          ...
      AttributeError: foo
  
      >>> b.bar
      'baz'
      >>> getattr(b, 'bar')
      'baz'
      >>> b['bar']
      'baz'
  
      >>> b.lol is b['lol']
      True
      >>> b.lol is getattr(b, 'lol')
      True
      """
      try:
          # Throws exception if not in prototype chain
          return object.__getattribute__(self, k)
      except AttributeError:
          try:
              return self[k]
          except KeyError:
              raise AttributeError(k)
  
imports: from collections.abc import Mapping
label_desc: Use image node_id 2 for calling the Munch obj's underlying member method code with example usage: obj.__getattr__(k) and returns: object, self