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?

1377voto

user28409 Punkte 35934
my_function.__name__

使用方法 __name__ ist die bevorzugte Methode, da sie gleichmäßig angewendet wird. Im Gegensatz zu func_name funktioniert es auch bei eingebauten Funktionen:

>>> import time
>>> time.time.func_name
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'func_name'
>>> time.time.__name__ 
'time'

Auch die doppelten Unterstriche zeigen dem Leser, dass es sich um ein besonderes Attribut handelt. Als Bonus haben Klassen und Module ein __name__ Attribut, so dass Sie sich nur einen speziellen Namen merken müssen.

430voto

Albert Vonpupp Punkte 4109

Um den Namen der aktuellen Funktion oder Methode aus dem Inneren heraus zu erhalten, beachten Sie:

import inspect

this_function_name = inspect.currentframe().f_code.co_name

sys._getframe funktioniert auch anstelle von inspect.currentframe obwohl letztere den Zugriff auf eine private Funktion vermeidet.

Um stattdessen den Namen der aufrufenden Funktion zu erhalten, sollten Sie f_back wie in inspect.currentframe().f_back.f_code.co_name .


Wenn Sie auch mypy kann sie sich darüber beschweren:

Fehler: Element "None" von "Optional[FrameType]" hat kein Attribut "f_code"

Um den obigen Fehler zu unterdrücken, sollten Sie überlegen:

import inspect
import types
from typing import cast

this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name

53voto

lapis Punkte 6494

Wenn Sie auch an Klassenmethoden interessiert sind, hat Python 3.3+ __qualname__ zusätzlich zu __name__ .

def my_function():
    pass

class MyClass(object):
    def method(self):
        pass

print(my_function.__name__)         # gives "my_function"
print(MyClass.method.__name__)      # gives "method"

print(my_function.__qualname__)     # gives "my_function"
print(MyClass.method.__qualname__)  # gives "MyClass.method"

48voto

Markus Jarderot Punkte 83090
my_function.func_name

Es gibt noch weitere interessante Eigenschaften von Funktionen. Typ dir(func_name) um sie aufzulisten. func_name.func_code.co_code ist die kompilierte Funktion, die als Zeichenkette gespeichert ist.

import dis
dis.dis(my_function)

zeigt den Code in presque menschenlesbares Format :)

41voto

Ma Guowei Punkte 431
import inspect

def foo():
   print(inspect.stack()[0][3])

wobei

  • stack()[0] ist der Anrufer

  • stack()[3] ist der Stringname der Methode

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