@contextlib.contextmanager
def assure_cleanup(enter_func, exit_func, use_enter_return):
 enter_return = None
 try:
  if isinstance(enter_func, functools.partial):
   enter_func_name = enter_func.func.__name__
  else:
   enter_func_name = enter_func.__name__
  LOG.debug('Entering context. Function: %(func_name)s, use_enter_return: %(use)s.', {'func_name': enter_func_name, 'use': use_enter_return})
  enter_return = enter_func()
  (yield enter_return)
 finally:
  if isinstance(exit_func, functools.partial):
   exit_func_name = exit_func.func.__name__
  else:
   exit_func_name = exit_func.__name__
  LOG.debug('Exiting context. Function: %(func_name)s, use_enter_return: %(use)s.', {'func_name': exit_func_name, 'use': use_enter_return})
  if (enter_return is not None):
   if use_enter_return:
    ignore_exception(exit_func, enter_return)
   else:
    ignore_exception(exit_func)

@ contextlib . contextmanager def assure_cleanup ( enter_func , exit_func , use_enter_return ) : enter_return = None try : if isinstance ( enter_func , functools . partial ) : enter_func_name = enter_func . func . __name__ else : enter_func_name = enter_func . __name__ LOG . debug ( 'Entering context. Function: %(func_name)s, use_enter_return: %(use)s.' , { 'func_name' : enter_func_name , 'use' : use_enter_return } ) enter_return = enter_func ( ) ( yield enter_return ) finally : if isinstance ( exit_func , functools . partial ) : exit_func_name = exit_func . func . __name__ else : exit_func_name = exit_func . __name__ LOG . debug ( 'Exiting context. Function: %(func_name)s, use_enter_return: %(use)s.' , { 'func_name' : exit_func_name , 'use' : use_enter_return } ) if ( enter_return is not None ) : if use_enter_return : ignore_exception ( exit_func , enter_return ) else : ignore_exception ( exit_func )
assures the resource is cleaned up .