首页 > 解决方案 > 获取外部范围的帧信息,但只在内部范围内投入时间

问题描述

我有以下场景,我想在我的范围之上获取范围的框架信息。

def outer():
    # This is really slow.
    frames = inspect.stack()

    def inner():
        # I would like to "pay for it" here instead.
        print(frames)

    return inner

通话inspect.stack()很慢,所以我只想在真正需要时才这样做,即有人打电话时inner。但是如果我将它移动到内部函数中,我会得到与我需要的不同的帧。

或者,如果我能以其他方式快速获得所有的frame.filenameand frame.lineno,(对于外部范围的每个),那也很好。frame

标签: pythonhigher-order-functionsinspect

解决方案


没有办法将工作推迟到inner通话之前,因为此时您想要的信息已不存在。如果您尝试将工作延迟到inner,您将只能检索有关inner调用时程序状态的信息,这将是与调用时完全不同的状态outer

也就是说,inspect.stack速度很慢,你只关心文件名和行号信息。inspect.stack正在做很多你不想要的工作。如果你想要的只是文件名和行号信息,你可以使用traceback.extract_stack,这应该会快很多。

您可以通过手动提取所需信息来更快:

def do_it_manually():
    frame = inspect.currentframe().f_back
    results = []
    while frame:
        results.append((frame.f_code.co_filename, frame.f_lineno))
        frame = frame.f_back
    return results

这给出了一个(filename, lineno)元组列表,从do_it_manually的调用者开始。它比inspect.stack我用深堆栈测试它快几个数量级。


推荐阅读