То, о чем вы просили, не может быть выполнено (приятно - есть способы сделать это, но они - неприятные хаки).НО: ты действительно не хочешь этого делать.Подумайте на более высоком уровне: вам нужен простой способ изменить функцию, чтобы регистрировать ее запуск.Изменение исходного кода функции не является хорошим способом сделать это - в конце концов, регистрация не имеет никакого отношения к тому, что делает функция!Вместо этого вы хотите изменить функцию ex post facto .
def startLog( func ):
def loggedFunc( *args, **kwargs ):
print( "starting {0} with {1}".format( func.__name__, args[ 0 ] ) )
return func( *args, **kwargs )
return loggedFunc
@startLog
def theFunc( ):
print( "running theFunc" )
theFunc( )
# starting theFunc
# running theFunc
. Это пример Python декоратора : он преобразует функцию во время определенияв другой.Это синтаксический сахар для:
def theFunc( ):
print( "running theFunc" )
theFunc = startLog( theFunc )
Другими словами, вы берете сам объект функции (помните - функции тоже являются объектами, вы можете передавать их, изменять, просматривать их атрибуты и т. Д.!) и переопределить его.Глядя на исходный код, мы видим, что startLog
определяет новую функцию (loggedFunc
), которая сначала печатает трассировку журнала, а затем запускает исходную функцию, передавая ее аргументы.Применение декоратора заменяет theFunc
на loggedFunc
, так что функция, связанная с именем theFunc
, теперь регистрирует себя!
Имеет ли это смысл?Я рад объяснить это более подробно.
Редактировать
Как уже указывалось, это не дает конкретного ответа на ваш вопрос;если вам нужно больше функциональности, чем этот, то используйте модуль logging
, который делает все, что вам когда-либо понадобится, а затем еще немного.Ходить по стеку просто неприлично и хрупко, хотя = p.