2011-09-15 12 views
6

संभव डुप्लिकेट:
How to get the function name as string in Python?पायथन में स्ट्रिंग के रूप में फ़ंक्शन नाम कैसे प्राप्त करें?

मैं जानता हूँ कि मैं ऐसा कर सकते हैं कि:

def func_name(): 
    print func_name.__name__ 

जो 'my_func' के रूप में समारोह के नाम वापस आ जाएगी।

लेकिन जैसा कि मैं समारोह में हूं, क्या इसे सामान्य रूप से सीधे कॉल करने का कोई तरीका है? कुछ की तरह:

def func_name(): 
    print self.__name__ 

जिसमें अजगर को समझना होगा कि मैं अपने कोड पदानुक्रम के ऊपरी भाग करना चाहते हैं?

+1

btw, 'self' में एक जादू शब्द नहीं है पायथन, यह एक उदाहरण विधि को पारित पहले पैरामीटर का नाम देने के लिए सिर्फ एक सम्मेलन है (जो उदाहरण है कि विधि बाध्य है)। – geoffspear

+1

मुझे नहीं लगता कि कोई आसान समाधान है। इस प्रश्न को जांचें http://stackoverflow.com/questions/5063607/is-there-a-self-flag-can-reference-python-function-inside-itself – rplnt

+1

आप नाम का उपयोग करने की क्या योजना बना रहे हैं? –

उत्तर

5

AFAIK, ऐसा नहीं है। इसके अलावा, यहां तक ​​कि अपने पहली विधि, पूरी तरह से विश्वसनीय नहीं है, क्योंकि एक समारोह वस्तु से अधिक नाम हो सकते हैं:

In [8]: def f(): pass 
    ...: 

In [9]: g = f 

In [10]: f.__name__ 
Out[10]: 'f' 

In [11]: g.__name__ 
Out[11]: 'f' 
2

एक संभव विधि Decorators उपयोग करने के लिए होगा: इस के साथ

def print_name(func, *args, **kwargs): 
    def f(*args, **kwargs): 
     print func.__name__ 
     return func(*args, **kwargs) 
    return f 

@print_name 
def funky(): 
    print "Hello" 

funky() 

# Prints: 
# 
# funky 
# Hello 

समस्या आप जाएगा केवल वास्तविक कार्य को कॉल करने से पहले या बाद में फ़ंक्शन नाम मुद्रित करने में सक्षम हो।

यथार्थ रूप से हालांकि, चूंकि आप पहले से ही फ़ंक्शन को परिभाषित कर रहे हैं, तो क्या आप नाम को हार्डकोड नहीं कर सकते?

9
नहीं

सामान्य रूप से है, लेकिन आप का निरीक्षण लाभ उठा सकते हैं

import inspect 

def callee(): 
    return inspect.getouterframes(inspect.currentframe())[1][1:4][2] 

def my_func(): 
    print callee() // string my_func 

स्रोत http://code.activestate.com/recipes/576925-caller-and-callee/

5

तुम भी traceback मॉड्यूल का उपयोग कर सकते हैं:

import traceback 

def test(): 
    stack = traceback.extract_stack() 
    print stack[len(stack)-1][2] 


if __name__ == "__main__": 
    test() 
संबंधित मुद्दे

 संबंधित मुद्दे