跟踪时获取python内置函数的返回值

2024-06-24 12:47:03 发布

您现在位置:Python中文网/ 问答频道 /正文

通过使用sys.setprofile(profilefunc),我不仅可以跟踪常规Python函数,还可以通过事件“c_call”和“c_return”跟踪内置函数,但我找不到获取内置函数返回值的方法

对于常规函数,如果event等于“return”,则传递给profilefunc的参数arg引用返回值。 但是,如果event等于“c_return”,则arg是c函数对象

有没有其他方法可以检索内置函数的返回值?也许通过从帧中提取最后返回的值

下面是一个简单的例子:

import sys
import numpy as np
from types import FrameType


def tracefunc(frame: FrameType, event: str, arg):
    if event == 'call':
        func_name = frame.f_code.co_name
        print(f'Call_to {func_name}')
    elif event == 'return':
        func_name = frame.f_code.co_name
        print(f'Return_from {func_name}, returning {arg}')
    elif event == 'c_call':
        func_name = arg.__name__
        print(f'Call_to_builtin {func_name}')
    elif event == 'c_return':
        func_name = arg.__name__
        print(f'Return_from_builtin {func_name}, returning ???')
    return tracefunc


if __name__ == '__main__':
    sys.setprofile(tracefunc)
    # non-builtin function
    foo = [x + 1 for x in [1, 2]]
    # builtin function
    bar = np.random.uniform()
    sys.setprofile(None)

与输出

Call_to <listcomp>
Return_from <listcomp>, returning [2, 3]
Call_to_builtin uniform
Return_from_builtin uniform, returning ???
Call_to_builtin setprofile

Tags: to函数namefromeventreturnsysarg