2017-08-02 11 views
6

Czy istnieje sposób tak, że następujący kod:Python: jak zdobyć * pełne * nazwę funkcji jestem w

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

wyświetlacze:

f1: hello 
cls.f1: hi there 

zamiast:

f1: hello 
f1: hi there 

?

Próbowałem użyć modułu 'sprawdzać', ale nie był udany ...

Julien

EDIT:

Chodzi o to, aby funkcja 'log', aby móc pobierać jego nazwa wywołująca: (samodzielnie za pomocą tracebacka, inspekcji lub dowolnej innej koniecznej).

Nie chcę przekazywać nazwy klasy ani niczego innego niż "wiadomość" do funkcji "log".

+1

Czy możesz użyć ['__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 ze względu na składnię python2.x w pytaniu I ' nie zgadujesz? –

Odpowiedz

-1

Moduł inspect jest bardzo mocny i może być używany w sposób podobny do sposobu korzystania traceback aby uzyskać nazwę funkcji, a prawdopodobnie również nazwa klasy. Ale można po prostu skorzystać z faktu, że masz zmienną self instancji, który zna z własnego typu/klasy:

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

Masz rację. Jednak to, co naprawdę próbuję osiągnąć (przykro mi, że nie zadałem tego wyraźnie w moim pytaniu), to odzyskać nazwę klasy ze śledzenia, bez potrzeby przekazywania jej jako argumentu do mojej funkcji "logowania". –

0

więc w końcu wymyślił tę metodę:

#!/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) 

potrzebuje python3, aby można było używać __qualname__.

Powiązane problemy