Python - 如果用户试图在中途停止执行,有没有办法优雅地清理函数?

Ale*_*are 3 python

说我有一个类

class Thing():

    def __init__(self):
        self.some_state = False

    def do_stuff(self):
        self.some_state = True
        # do stuff which may take some time - and user may quit here
        self.some_state = False

    def do_other_stuff(self):
        # do stuff which depends on `some_state` being False

Run Code Online (Sandbox Code Playgroud)

我想确保用户是否通过运行以下命令在笔记本中执行此操作:

thing = Thing()
thing.do_stuff()
Run Code Online (Sandbox Code Playgroud)

然后在运行时按“停止执行”,some_state切换回False. 这种方式do_other_stuff将按预期工作。有没有办法做一些优雅的清理?

注意:虽然我的例子很具体,但我的问题通常是:“我可以进行优雅的清理吗?”

Gil*_*il' 5

停止执行会引发 KeyboardInterrupt异常,因此您需要处理该异常。但实际上,some_state如果代码也以其他异常退出,您可能需要重置。即使您没有明确提出异常,它们也可能由于代码中的错误或内存不足而发生。因此,请在finally子句中进行清理。

    def do_stuff(self):
        self.some_state = True
        try:
            # do stuff which may take some time - and user may quit here
        finally:
            self.some_state = False
Run Code Online (Sandbox Code Playgroud)

如果许多方法需要相同的清理,您可以使用装饰器,Tgsmith61591 所示

  • @AlexanderSoare `finally` 重新​​引发异常。需要捕获异常并重新引发它的情况并不常见,主要是在您想要记录异常时完成。 (3认同)