Общеизвестно, что есть много способов получить имя функции, используя стандартную библиотеку Python, вот небольшой пример:
import sys
import dis
import traceback
def get_name():
stack = traceback.extract_stack()
filename, codeline, funcName, text = stack[-2]
return funcName
def foo1():
print("Foo0 start")
print("Inside-_getframe {0}".format(sys._getframe().f_code.co_name))
print("Inside-traceback {0}".format(get_name()))
print("Foo1 end")
def foo2():
print("Foo2 start")
print("Inside {0}".format(sys._getframe().f_code.co_name))
print("Inside-traceback {0}".format(get_name()))
print("Foo2 end")
def foo3():
print("Foo3 start")
print("Inside {0}".format(sys._getframe().f_code.co_name))
print("Inside-traceback {0}".format(get_name()))
print("Foo3 end")
for f in [foo1, foo2, foo3]:
print("Outside: {0}".format(f.__name__))
f()
print('-' * 80)
Вы можете использовать traceback, sys._getframe, dis и, возможно, есть много других опций... пока все хорошо, Python отлично подходит для такого рода самоанализа.
Теперь, вот в чем дело, я хотел бы знать, как автоматически обертывать функции (на уровне файла), чтобы печатать его имя, а также измерять время выполнения при их выполнении. Например, что-то вроде этого:
def foo1():
print("Foo0 processing")
def foo2():
print("Foo2 processing")
def foo3():
print("Foo3 processing")
wrap_function_from_this_file()
for f in [foo1, foo2, foo3]:
f()
print('-' * 80)
Напечатал бы что-то вроде:
foo1 started
Foo1 processing
foo1 finished, elapsed time=1ms
--------------------------------------------------------------------------------
foo2 started
Foo2 processing
foo2 finished, elapsed time=2ms
--------------------------------------------------------------------------------
foo3 started
Foo3 processing
foo3 finished, elapsed time=3ms
--------------------------------------------------------------------------------
Как видите, идея состоит в том, чтобы не добавлять никакие оболочки для каждой функции вручную в файл functions. wrap_function_from_this_file автоматически проанализирует файл, в котором выполняется, и несколько изменит функции, оборачивающие их, в данном случае оборачивая функции некоторым кодом, печатающим его имя и время выполнения.
Просто для протокола: я не прошу никакого профилировщика. Я хотел бы знать, возможно ли это сделать и как.