Регистрация функции для выполнения при выходе из функции - PullRequest
1 голос
/ 05 июня 2019

Python имеет встроенный API atexit для регистрации функций, выполняемых в программе exit.

В моем случае у меня есть функция API, которую можно импортировать и использовать, которая создает временный каталог, который необходимо очистить при возврате функции (или возникновении исключения).

Вместо использования try-finally, существует ли какой-либо традиционный способ регистрации функции, которая будет выполняться при function exit?

1 Ответ

2 голосов
/ 05 июня 2019

Самый простой способ сделать это повторно - просто использовать декоратор:

def cleanup(action):
    def decorator(func):
        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            finally:
                action()
        return wrapper
    return decorator

Например:

>>> def postrun():
...     print("afterwards")
... 
>>> @cleanup(postrun) 
... def divider(x, y):
...     return x / y
... 
>>> divider(2, 3)
afterwards
0.6666666666666666
>>> divider(2, 0)
afterwards
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jsharpe/workspace/perigon/test.py", line 5, in wrapper
    return func(*args, **kwargs)
  File "<stdin>", line 3, in divider
ZeroDivisionError: division by zero

Вы также можете передать args и kwargs на action, если считаете, что они понадобятся для очистки.

...