Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 注册要在函数退出时执行的函数_Python_Temporary Files_Resource Cleanup_Temporary Directory - Fatal编程技术网

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

Python 注册要在函数退出时执行的函数,python,temporary-files,resource-cleanup,temporary-directory,Python,Temporary Files,Resource Cleanup,Temporary Directory,Python有atexit内置API,用于注册程序退出时要执行的函数 在我的例子中,我有一个可以导入和使用的API函数,它创建了一个临时目录,当函数返回(或引发异常)时需要清理该目录 除了使用try finally,还有什么常规的方法来注册要在函数退出时执行的函数吗?最简单的方法就是使用decorator: def cleanup(action): def decorator(func): def wrapper(*args, **kwargs):

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

在我的例子中,我有一个可以导入和使用的API函数,它创建了一个临时目录,当函数返回(或引发异常)时需要清理该目录


除了使用
try finally
,还有什么常规的方法来注册要在函数退出时执行的函数吗?

最简单的方法就是使用decorator:

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
>>def postrun():
...     打印(“之后”)
... 
>>>@cleanup(后期运行)
... def分配器(x,y):
...     返回x/y
... 
>>>分隔器(2,3)
之后
0.6666666666666666
>>>分隔器(2,0)
之后
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/jsharpe/workspace/perigon/test.py”,第5行,在包装器中
返回函数(*args,**kwargs)
文件“”,第3行,在分隔符中
ZeroDivision错误:被零除

如果您认为清理需要
args
kwargs
操作,也可以将它们传递给
action

Why“而不是使用
尝试最后”
?如果您想将该逻辑移出函数本身,只需编写一个包装器。如果您想使其可重用,可以编写一个装饰器。否则,你会调用finally块中的一堆东西。