关于显式删除 Python 帧的问题
Questions about explicitly deleting Python frames
我在 Python 的 documentaton 中找到了这段话:
我有几个问题:
为什么 finally
使销毁具有确定性? try ... finally: del frame
和没有finally
的del frame
有什么区别?
假设我有很多使用框架的函数,我想创建一个装饰器来帮助我避免每次都写 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):
...
不需要做任何事情。
我在 Python 的 documentaton 中找到了这段话:
我有几个问题:
为什么
finally
使销毁具有确定性?try ... finally: del frame
和没有finally
的del frame
有什么区别?假设我有很多使用框架的函数,我想创建一个装饰器来帮助我避免每次都写
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):
...
不需要做任何事情。