import threading class RAIILock: def __init__(self, lock: threading.RLock, defer=False): self.__lock = lock self.__defer = defer self.__acquired = False def __enter__(self): if self.__defer is False: self.acquire() return self def __exit__(self, exc_type, exc_val, exc_tb): self.release() def acquire(self): self.__lock.acquire() self.__acquired = True def release(self): if self.__acquired: self.__lock.release() self.__acquired = False