Получить значение python встроенных функций при трассировке - PullRequest
1 голос
/ 06 апреля 2020

Используя sys.setprofile (profilefun c), я могу отслеживать не только обычные Python функции, но и встроенные через события "c_call" и "c_return", но не могу найти способ получения возвращаемого значения встроенной функции.

Для обычной функции параметр arg, который передается в profilefun c, ссылается на возвращаемое значение, если event равно "return ». Однако, если 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
...