parameters: (func)
return_statement: return wrapper
docstring: Re-throw uncaught `AttributeError`.
  
      Usage:  Put ``@rethrow_uncaught`` in front of the function
      which does **not** suppose to raise `AttributeError`.
  
      AttributeError is easily get caught by `hasattr` and another
      ``except AttributeError`` clause.  This becomes problem when you use
      a lot of "dynamic" attributes (e.g., using ``@property``) because you
      can't distinguish if the property does not exist for real or some code
      inside of the "dynamic" attribute through that error.  In a well
      written code, such error should not exist but getting there is very
      difficult.  This decorator is to help us getting there by changing
      `AttributeError` to `UncaughtAttributeError` to avoid unexpected catch.
      This helps us noticing bugs earlier and facilitates debugging.
  
      .. note:: Treating StopIteration here is easy.
                Add that feature when needed.
docstring_summary: Re-throw uncaught `AttributeError`.
docstring_tokens: Re - throw uncaught AttributeError .
function: def reraise_uncaught(func):
      """
      Re-throw uncaught `AttributeError`.
  
      Usage:  Put ``@rethrow_uncaught`` in front of the function
      which does **not** suppose to raise `AttributeError`.
  
      AttributeError is easily get caught by `hasattr` and another
      ``except AttributeError`` clause.  This becomes problem when you use
      a lot of "dynamic" attributes (e.g., using ``@property``) because you
      can't distinguish if the property does not exist for real or some code
      inside of the "dynamic" attribute through that error.  In a well
      written code, such error should not exist but getting there is very
      difficult.  This decorator is to help us getting there by changing
      `AttributeError` to `UncaughtAttributeError` to avoid unexpected catch.
      This helps us noticing bugs earlier and facilitates debugging.
  
      .. note:: Treating StopIteration here is easy.
                Add that feature when needed.
      """
      @functools.wraps(func)
      def wrapper(*args, **kwds):
          try:
              return func(*args, **kwds)
          except AttributeError:
              exc_info = sys.exc_info()
              reraise(UncaughtAttributeError(exc_info[1]), exc_info[2])
      return wrapper
function_tokens: def reraise_uncaught ( func ) : @ functools . wraps ( func ) def wrapper ( * args , * * kwds ) : try : return func ( * args , * * kwds ) except AttributeError : exc_info = sys . exc_info ( ) reraise ( UncaughtAttributeError ( exc_info [ 1 ] ) , exc_info [ 2 ] ) return wrapper