Работаю с множеством данных, данные обрабатывает множество классов. Пытаюсь сделать сохранение текущих обработанных данных после того, как были нажаты Ctrl+C
, но не хочется постоянно писать одно и то же.
Как возможно максимально сократить строки кода?
try: working() except KeyboardInterrput: dumpfile(storage_link) sys.exit()
Вот так:
def decorator(exc_type=KeyboardInterrput): def dec(func): def temp(*args, **kwargs): try: return func(*args, **kwargs) except exc_type as e: #передаем в dumpfile функцию и её вхожние параметры в случае если произошло исключение dumpfile(func, args, kwargs) #простого перепорождения должно быть достаточно raise e return temp return dec
Использование:
@decorator() def working(): while True: pass working()
from contextlib import contextmanager @contextmanager def dumpfile(storage_link, err=(IndexError, KeyboardInterrput)): try: yield except err: print('dump', storage_link) def working(storage_link): raise KeyboardInterrput print(storage_link) if __name__ == '__main__': storage_link = 'link' with dumpfile(storage_link): working(storage_link)
Более одного раза KeyboardInterrupt
писать обычно не требуется (иначе реорганизуйте код, чтобы только один раз из главного потока на самом верхнем уровне ловилось исключение или в signal handler для SIGINT
, если вы переопределили его).
Если вы думаете, что вам нужно чаще except KeyboardInterrupt
писать, то попробуйте регистрировать atexit
handler вместо этого для кода, который следует один раз выполнить при нормальном завершении.
Если вы хотите знать как можно код сократить, который cleanup процедуры вызывает в присутствии исключений вообще, то существует множество подходов: try/finally, with-конструкция (contextlib.ExitStack
для гибкости, если существующих context manager не хватает), декораторы, создание специальных объектов, которые поведение скрывают, итд (практически всё что вы в обычном Питон коде можете использовать, можно применить и для сокращения кода, который исключения обрабатывает в общем случае).