使用列表中的匿名函数在python中处理清理操作
在Python中,需要在finally块中按相反顺序清理所有操作 我将用Perl解释这个要求使用列表中的匿名函数在python中处理清理操作,python,list,code-cleanup,Python,List,Code Cleanup,在Python中,需要在finally块中按相反顺序清理所有操作 我将用Perl解释这个要求 sub fun1{ add_1(); verify_1(); add_2(); verify_2(); remove_2(); remove_1(); } 如果verify_2()引发异常,add_1()保持未清除状态 这就是我在Perl中处理清理的方式 sub fun1{ @cleanUpActions = (); try { add_1
sub fun1{
add_1();
verify_1();
add_2();
verify_2();
remove_2();
remove_1();
}
如果verify_2()
引发异常,add_1()
保持未清除状态
这就是我在Perl中处理清理的方式
sub fun1{
@cleanUpActions = ();
try {
add_1();
push (@cleanUpActions, sub {remove_1()} );
verify_1();
add_2();
push (@cleanUpActions, sub {remove_2()} );
verify_2();
remove_2();
pop @cleanUpActions;
remove_1();
pop @cleanUpActions;
} catch {
BaseException->throw("")
} finally{
foreach my $action (reverse @cleanUps){
&$action;
}
}
}
在Python中尝试了相同的逻辑
def r2():
remove_2()
def r1():
remove_1()
clean_list = []
def fun1():
try:
add_1()
clean_list.append(r1)
verify_1()
add_2()
clean_list.append(r2)
verify_2()
remove_2();
clean_list.pop()
remove_1();
clean_list.pop()
except:
raise Exception
finally:
clean_list.reverse()
for func in clean_list:
func()
上面的Python代码可以工作,但不是我需要的。与编写单独的def不同,我希望将函数块作为匿名func添加到列表中,就像我在Perl中所做的那样。
Python Lambda只接受表达式,不支持多行体
在Python中是否有其他有效的方法来处理此类清理操作。匿名子类在Python中称为“lambdas”
def r2():
remove_2()
def r1():
remove_1()
clean_list = []
def fun1():
try:
add_1()
clean_list.append(r1)
verify_1()
add_2()
clean_list.append(r2)
verify_2()
remove_2();
clean_list.pop()
remove_1();
clean_list.pop()
except:
raise Exception
finally:
clean_list.reverse()
for func in clean_list:
func()
add_1()
clean_list.append(lambda:remove_1())
验证_1()
也就是说,您可以使用不带()
的函数名作为函数指针
>>def():
... 打印(“foo”)
...
>>>x=f
>>>x()
福
所以你只需要
add_1()
清除\u列表。追加(删除\u 1)
验证_1()
还请注意,您可以在函数内部使用def
,从而创建多语句清理函数
add_1()
def r1():
删除_1()
清除列表。追加(r1)
验证_1()
谢谢。如果没有名为remove_1
和remove_2
的函数。那么我们怎么能在这里只添加函数体呢。正文包含多行。如果不是remove_1
,您可能应该具有remove
功能,在这种情况下,您可以使用lambda
方法。尽管如此,您仍然可以使用一个局部函数,如我的答案的上方部分所示