def catch_notimplementederror(f):
 def wrapped_func(self, *args, **kwargs):
  try:
   return f(self, *args, **kwargs)
  except NotImplementedError:
   frame = traceback.extract_tb(sys.exc_info()[2])[(-1)]
   LOG.error(('%(driver)s does not implement %(method)s' % {'driver': type(self.connection), 'method': frame[2]}))
 wrapped_func.__name__ = f.__name__
 wrapped_func.__doc__ = f.__doc__
 return wrapped_func

def catch_notimplementederror ( f ) : def wrapped_func ( self , * args , ** kwargs ) : try : return f ( self , * args , ** kwargs ) except NotImplementedError : frame = traceback . extract_tb ( sys . exc_info ( ) [ 2 ] ) [ ( - 1 ) ] LOG . error ( ( '%(driver)s does not implement %(method)s' % { 'driver' : type ( self . connection ) , 'method' : frame [ 2 ] } ) ) wrapped_func . __name__ = f . __name__ wrapped_func . __doc__ = f . __doc__ return wrapped_func
decorator to simplify catching drivers raising notimplementederror if a particular call makes a driver raise notimplementederror .