Получить родительскую функцию - PullRequest
8 голосов
/ 27 марта 2010

Есть ли способ узнать, какая функция называется текущей функцией?Так, например:

def first():
    second()

def second():
    # print out here what function called this one

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 27 марта 2010
import inspect

def first():
    return second()

def second():
    return inspect.getouterframes( inspect.currentframe() )[1]

first()[3] # 'first'
2 голосов
/ 27 марта 2010

Модуль inspect допускает многие формы самоанализа, включая этот, но учтите, что такую ​​информацию рекомендуется использовать только для таких целей, как отладка, а не как часть функциональности вашего производственного кода. См. документы для всех деталей.

2 голосов
/ 27 марта 2010

Вы можете использовать функцию extract_stack модуля трассировки.

import traceback
def first():
    second()

def second():
    print traceback.extract_stack(limit=2)[-2][2]
1 голос
/ 27 марта 2010

Они хорошо работают для быстрого добавления минимальных средств отладки «где я», когда вы не хотите импортировать еще один модуль. (Только CPython, только для отладки.)

def LINE( back = 0 ):
    return sys._getframe( back + 1 ).f_lineno
def FILE( back = 0 ):
    return sys._getframe( back + 1 ).f_code.co_filename
def FUNC( back = 0):
    return sys._getframe( back + 1 ).f_code.co_name
def WHERE( back = 0 ):
    frame = sys._getframe( back + 1 )
    return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ),
                            frame.f_lineno, frame.f_code.co_name )

Пример:

import sys, os # these you almost always have...

def WHERE( back = 0 ):
    frame = sys._getframe( back + 1 )
    return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ),
                        frame.f_lineno, frame.f_code.co_name )

def first():
    second()

def second():
    print WHERE()
    print WHERE(1)

first()

Выход:

$ python fs.py
fs.py/12 second()
fs.py/9 first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...