Ниже приведена моя функция trace_calls, используемая для получения вывода в формате json файла callgraph.
Мой вывод {"callgraph": ["function_1", "function_2", "c", "function_2", "retjson", "dumps", "encode", "iterencode"]}
, который включает внутренние функции ("retjson", "dumps", "encode", "iterencode"
) пакетов икак он был вызван после перехвата settrace.
То, что я хочу, это json as return {"callgraph": ["function_1", "function_2", "c", "function_2"]}
Вещи, которые я уже пробовал: - if event == 'return':
, но это не помогло пропуститьфункция с возвратом.причина в содержании документа:
'return'
Функция (или другой блок кода) собирается вернуться.Вызвана локальная функция трассировки;arg - это значение, которое будет возвращено, или None, если событие вызвано вызванным исключением.Возвращаемое значение функции трассировки игнорируется.
def retjson(x):
python2json = json.dumps({"callgraph": x})
return python2json
def trace_calls(frame, event, arg):
if event != ('call'):
return
co = frame.f_code
func_name = co.co_name
if func_name == ('write'):
# Ignore write() calls from print statements
return
func_line_no = frame.f_lineno
func_filename = co.co_filename
caller = frame.f_back
caller_line_no = caller.f_lineno
caller_filename = caller.f_code.co_filename
tree_list.append(func_name)
tree_line_list.append(caller_line_no)
x = json.dumps({"callgraph": tree_list})
y = json.dumps({"line_no": tree_line_list})
print ('Call to %s on line %s of %s from line %s of %s' % \
(func_name, func_line_no, func_filename,
caller_line_no, caller_filename))
return trace_calls
def function_2():
print ('in b()')
def function_1():
print ('in a()')
function_2()
c()
def c():
print ('in c()')
sys.settrace(trace_calls)
function_1()
function_2()
print(retjson(tree_list))