使用列表中的匿名函数在python中处理清理操作

使用列表中的匿名函数在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

在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();
   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
方法。尽管如此,您仍然可以使用一个局部函数,如我的答案的上方部分所示