2009-05-22 15 views
74

आप 2 कार्यों की तरह है, तो:पायथन में किसी अन्य फ़ंक्शन के अंदर कॉलर फ़ंक्शन नाम प्राप्त करना?

def A() : 
    B() 

def B() : 
    this.caller.name 
+1

आपके पास स्रोत उपलब्ध है। आपको ऐसी चीज़ क्यों चाहिए? –

+12

क्योंकि मैं एक 3 पार्टी एप्लिकेशन की अजगर दुभाषिया में कोड जहां कोई वास्तविक डिबगर है डिबगिंग कर रहा हूँ। की –

+3

संभव डुप्लिकेट [पायथन: कैसे बुलाया विधि में फोन करने वाले का नाम विधि प्राप्त करने के लिए] (http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in -इस तथाकथित-विधि) – bernie

उत्तर

103

आप बुला पाने के लिए inspect मॉड्यूल का उपयोग कर सकते हैं:

def A 
def B 

और एक बी कहता है, तुम कौन बी अंदर बी बुला रहा है, की तरह प्राप्त कर सकते हैं ढेर। यह फ्रेम रिकॉर्ड की एक सूची देता है। प्रत्येक रिकॉर्ड में तीसरा तत्व कॉलर नाम है। क्या आप चाहते हैं यह है:

>>> import inspect 
>>> def f(): 
...  print inspect.stack()[1][3] 
... 
>>> def g(): 
...  f() 
... 
>>> g() 
g 
बेशक

, यह एक विशेष सूचकांक का उपयोग करने के प्रयास करने से पहले वह पर्याप्त फ्रेम रिकॉर्ड मौजूद जांच करने के लिए एक अच्छा विचार है।

+6

अजगर 3.4 पर कम से कम यह काम नहीं करता, वे tuples के आदेश बदल गया है। एक नामित टपल अब किया जा रहा है तो यह inspect.stack उपयोग करने के लिए() सबसे अच्छा है [1] .filename – timeyyy

8

नीचे दिए गए उदाहरण में की तरह:

>>> def foo(): 
... global x 
... x = sys._getframe(1) 
... 
>>> def y(): foo() 
... 
>>> y() 
>>> x.f_code.co_name 
'y' 
>>> 

महत्वपूर्ण नोट: के रूप में यह _getframe विधि का नाम (हे, यह एक अंडरस्कोर के साथ शुरू होता है) से स्पष्ट है, यह API पद्धति नहीं है एक होना चाहिए बिना सोचे-समझे पर भरोसा करते हैं । BaseConfig() में

+9

[sys._getframe] (http://docs.python.org/library/sys.html#sys._getframe) है "पायथन के सभी कार्यान्वयन में मौजूद होने की गारंटी नहीं है" - मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है। – RWS

+0

@RWS, धन्यवाद, –

2

आप उपयोगकर्ता लॉगिंग मॉड्यूल और% (फ़ाइल का नाम) निर्दिष्ट कर सकते हैं रों विकल्प

import logging 
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s') 

def A(): 
    logging.info('info') 
+1

आप अनजाने में कहते हैं कि '% (फ़ाइल का नाम) रों option' का उल्लेख किया। यह आपके कोड उदाहरण में होना चाहिए: '% (funcName) s' :) –

10

दो तरीके, sys का उपयोग करने और inspect मॉड्यूल हैं:

  • inspect.stack()[1][3]

stack() प्रपत्र कम पढ़ी जा सकती है और बाद से यह sys._getframe() कहता है, inspect.py से निकालने को देखने के कार्यान्वयन निर्भर है:

def stack(context=1): 
    """Return a list of records for the stack above the caller's frame.""" 
    return getouterframes(sys._getframe(1), context) 
4

यह मेरे लिए काम करता है! : डी

>>> def a(): 
...  import sys 
...  print sys._getframe(1).f_code.co_name 
... 
>>> def b(): 
...  a() 
... 
... 
>>> b() 
b 
>>> 
संबंधित मुद्दे