1085 Stimmen

Wie erhält man einen Funktionsnamen als String?

Wie erhalte ich in Python einen Funktionsnamen als String, ohne die Funktion aufzurufen?

def my_function():
    pass

print get_function_name_as_string(my_function) # my_function is not in quotes

sollte ausgeben "my_function" .

Gibt es eine solche Funktion in Python? Wenn nicht, gibt es Ideen, wie man sie implementieren kann? get_function_name_as_string in Python?

39voto

Demyn Punkte 1120

Diese Funktion gibt den Funktionsnamen des Aufrufers zurück.

def func_name():
    import traceback
    return traceback.extract_stack(None, 2)[0][2]

Es ist wie Albert Vonpupps Antwort mit einem freundlichen Umschlag.

29voto

radato Punkte 682

Ich verwende gerne einen Funktionsdekorator. Ich habe eine Klasse hinzugefügt, die auch die Zeit der Funktion angibt. Nehmen wir an, gLog ist ein Standard-Python-Logger:

class EnterExitLog():
    def __init__(self, funcName):
        self.funcName = funcName

    def __enter__(self):
        gLog.debug('Started: %s' % self.funcName)
        self.init_time = datetime.datetime.now()
        return self

    def __exit__(self, type, value, tb):
        gLog.debug('Finished: %s in: %s seconds' % (self.funcName, datetime.datetime.now() - self.init_time))

def func_timer_decorator(func):
    def func_wrapper(*args, **kwargs):
        with EnterExitLog(func.__name__):
            return func(*args, **kwargs)

    return func_wrapper

Jetzt müssen Sie Ihre Funktion nur noch ausschmücken und voilà

@func_timer_decorator
def my_func():

23voto

Mohsin Ashraf Punkte 834

Sie wollen nur den Namen der Funktion erhalten, hier ist ein einfacher Code dafür. Nehmen wir an, Sie haben diese Funktionen definiert

def function1():
    print "function1"

def function2():
    print "function2"

def function3():
    print "function3"
print function1.__name__

wird die Ausgabe sein Funktion1

Nehmen wir nun an, Sie haben diese Funktionen in einer Liste

a = [function1 , function2 , funciton3]

um den Namen der Funktionen zu erhalten

for i in a:
    print i.__name__

wird die Ausgabe sein

Funktion1
Funktion2
Funktion3

21voto

Jim G. Punkte 14548

Als eine Erweiterung von @Demyns Antwort Ich habe einige Hilfsfunktionen erstellt, die den Namen der aktuellen Funktion und die Argumente der aktuellen Funktion ausgeben:

import inspect
import logging
import traceback

def get_function_name():
    return traceback.extract_stack(None, 2)[0][2]

def get_function_parameters_and_values():
    frame = inspect.currentframe().f_back
    args, _, _, values = inspect.getargvalues(frame)
    return ([(i, values[i]) for i in args])

def my_func(a, b, c=None):
    logging.info('Running ' + get_function_name() + '(' + str(get_function_parameters_and_values()) +')')
    pass

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] -> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

my_func(1, 3) # 2016-03-25 17:16:06,927 [INFO] -> Running my_func([('a', 1), ('b', 3), ('c', None)])

19voto

sandyc Punkte 189

sys._getframe() ist nicht garantiert in allen Implementierungen von Python verfügbar ( siehe ref ), können Sie die traceback Modul, um das Gleiche zu tun, z. B.

import traceback
def who_am_i():
   stack = traceback.extract_stack()
   filename, codeline, funcName, text = stack[-2]

   return funcName

Ein Aufruf zur stack[-1] gibt die aktuellen Prozessdetails zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X