注册要在函数退出时执行的函数
Register function to be executed on function exit
Python 具有 atexit
内置 API 用于注册要在 程序 退出时执行的函数。
在我的例子中,我有一个可以导入和使用的 API 函数,它创建了一个临时目录,当函数 returns (或引发异常)时需要清理).
除了使用 try-finally
,是否有任何常规方法来注册要在 function 退出时执行的函数?
实现此可重用性的最简单方法就是使用装饰器:
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
如果您认为 clean-up.
需要它们,您也可以将 args
和 kwargs
传递给 action
Python 具有 atexit
内置 API 用于注册要在 程序 退出时执行的函数。
在我的例子中,我有一个可以导入和使用的 API 函数,它创建了一个临时目录,当函数 returns (或引发异常)时需要清理).
除了使用 try-finally
,是否有任何常规方法来注册要在 function 退出时执行的函数?
实现此可重用性的最简单方法就是使用装饰器:
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
如果您认为 clean-up.
需要它们,您也可以将args
和 kwargs
传递给 action