2010-03-27 10 views
8

¿Hay alguna manera de encontrar qué función se llama función actual? Entonces, por ejemplo:Obtener función principal

def first(): 
    second() 

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

¿Alguna idea?

+4

@MikeG .: Queriendo esta información en un comunicado de la producción es malo, sí. Usarlo para depurar y comprender una pieza grande de Python está bien, en mi humilde opinión. –

Respuesta

7
import inspect 

def first(): 
    return second() 

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

first()[3] # 'first' 
2

Puede usar la función extract_stack del módulo de rastreo.

import traceback 
def first(): 
    second() 

def second(): 
    print traceback.extract_stack(limit=2)[-2][2] 
2

inspect El módulo permite muchas formas de introspección incluido éste, pero tenga en cuenta que sólo se recomienda el uso de dicha información para fines tales como la depuración, no como parte de la funcionalidad de su código de producción. Vea the docs para todos los detalles.

1

Estos funcionan bien para agregar rápidamente ayudas mínimas para la eliminación de errores where-am-I cuando no desea importar otro módulo. (CPython solamente, para depurar solamente.)

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) 

Ejemplo:

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() 

Salida:

$ python fs.py 
fs.py/12 second() 
fs.py/9 first() 
Cuestiones relacionadas