注册要在函数退出时执行的函数



Python 具有atexit内置 API,用于注册要在程序退出时执行的函数。

就我而言,我有一个可以导入和使用的 API 函数,它会创建一个临时目录,当函数返回(或引发异常(时需要清理该目录。

除了使用try-finally,是否有任何常规方法可以注册要在函数退出时执行的函数?

重用最简单的方法是使用装饰器:

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

您也可以将argskwargs传递给action,如果您认为清理需要它们。

最新更新