2010-03-27 14 views
8

क्या कोई फ़ंक्शन ढूंढने का कोई तरीका है जो वर्तमान फ़ंक्शन कहलाता है? तो उदाहरण के लिए:पैरेंट फ़ंक्शन प्राप्त करें

def first(): 
    second() 

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

कोई विचार?

+4

@MikeG .: चाहते हैं एक उत्पादन विज्ञप्ति में यह जानकारी बुरा है, हाँ। पाइथन के एक बड़े टुकड़े को डीबग और समझने के लिए इसका उपयोग ठीक है, आईएमएचओ। –

उत्तर

7
import inspect 

def first(): 
    return second() 

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

first()[3] # 'first' 
2

आप ट्रेसबैक मॉड्यूल के extract_stack फ़ंक्शन का उपयोग कर सकते हैं।

import traceback 
def first(): 
    second() 

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

inspect मॉड्यूल इसे मिलाकर आत्मनिरीक्षण के कई रूपों के लिए अनुमति देता है, लेकिन ध्यान दें कि यह केवल नहीं अपने उत्पादन कोड की कार्यक्षमता के हिस्से के रूप में इस तरह के डिबगिंग जैसे उद्देश्यों के लिए इस तरह की जानकारी का उपयोग करने के लिए सिफारिश की है। सभी विवरणों के लिए the docs देखें।

1

ये जल्दी से कम से कम जहां-am-मैं डिबगिंग एड्स जोड़ने जब आप अभी तक एक और मॉड्यूल आयात करने के लिए नहीं करना चाहते हैं के लिए अच्छी तरह से काम करते हैं। (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() 
संबंधित मुद्दे