关于显式删除 Python 帧的问题

Questions about explicitly deleting Python frames

我在 Python 的 documentaton 中找到了这段话:

我有几个问题:

  1. 为什么 finally 使销毁具有确定性? try ... finally: del frame和没有finallydel frame有什么区别?

  2. 假设我有很多使用框架的函数,我想创建一个装饰器来帮助我避免每次都写 del frame,比如:

    def del_frame(f):
      def inner(frame):
        try:
          return f(frame)
        finally:
          del frame
    
      return inner
    
    @del_frame
    def function_that_uses_frame(frame):
      ...
    

    我没有删除function_that_uses_frame里面的frame是否符合销毁要求?

与核心开发人员交谈。原来我误解了文档。

唯一需要用户显式del frame或调用frame.clear()的情况是它导致循环引用。就像在给定的例子中,因为 frame 包含局部变量 frame 本身,因此造成了循环引用。

def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # do something with the frame
    finally:
        del frame

如果没有循环引用,而你只是在处理来自其他地方的框架对象,比如

def function_that_uses_frame(frame):
  ...

不需要做任何事情。