2017-08-02 6 views
6

में हूँ के नाम पाने के लिए वहाँ इतना है कि एक रास्ता है निम्नलिखित कोड:पायथन: कैसे * पूर्ण * समारोह मैं

import traceback 

def log(message): 
    print "%s: %s" %(traceback.extract_stack()[0:-1][-1][2], message) 

def f1(): 
    log("hello") 

class cls(object): 
    def f1(self): 
     log("hi there") 

f1() 
mycls = cls() 
mycls.f1() 

प्रदर्शित करता है:

f1: hello 
cls.f1: hi there 
बजाय

:

f1: hello 
f1: hi there 

?

मैं जुलिएन

मॉड्यूल का उपयोग करने के लिए 'का निरीक्षण' की कोशिश की लेकिन सफल नहीं हुआ था ...

संपादित करें:

यहां मुद्दा यह पुनः प्राप्त करने में सक्षम हो 'लॉग इन करें' समारोह के लिए है इसके कॉलर अपने नाम पर (ट्रेसबैक, निरीक्षण, या किसी भी आवश्यक साधन का उपयोग कर)।

मैं 'लॉग' फ़ंक्शन में 'संदेश' से कक्षा का नाम, या कुछ और नहीं पारित करना चाहता हूं।

+1

क्या आप ['__qualname__'] (https://www.python.org/dev/peps/pep-3155/) का उपयोग कर सकते हैं? – mgilson

+0

https://stackoverflow.com/questions/10973362/python-logging-function-name-file-name-line-number-using-a-single-file –

+0

@mgilson ने प्रश्न में python2.x वाक्यविन्यास दिया ' अनुमान नहीं है? –

उत्तर

-1

inspect मॉड्यूल बहुत शक्तिशाली वर्ग के नाम है, और जिस तरह से आप traceback का उपयोग समारोह के नाम पर प्राप्त करने के लिए करने के लिए इसी तरह से इस्तेमाल किया जा सकता है, और शायद यह भी। लेकिन आप बस सच है कि आप self उदाहरण चर है, अपने स्वयं के प्रकार/वर्ग के जानता है जो का उपयोग कर सकते:

#!/usr/bin/env python3 

def log(message): 
    import inspect 
    import gc 
    code = inspect.currentframe().f_back.f_code 
    func = [obj for obj in gc.get_referrers(code) if inspect.isfunction(obj)][0] 
    print(func.__qualname__, message) 

यह की जरूरत है:

import inspect 

class cls(object): 
    def f1(self): 
     this_class_name = type(self).__name__ 
     this_func_name = inspect.currentframe().f_code.co_name 
     print(this_class_name, this_func_name) 

mycls = cls() 
mycls.f1() 
+0

के बजाय पूरा नाम चाहता हूं आप सही हैं। हालांकि, मैं वास्तव में क्या हासिल करने की कोशिश कर रहा हूं (खेद है कि मैंने स्पष्ट रूप से मेरे प्रश्न में यह नहीं पूछा था) कक्षा के नाम को ट्रेसबैक से पुनर्प्राप्त करना है, इसे मेरे 'लॉग' फ़ंक्शन के लिए तर्क के रूप में पास करने की आवश्यकता के बिना। –

0

तो मैं अंततः इस विधि आया python3 ताकि __qualname__ का उपयोग किया जा सके।

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