Ja, es gibt eine Möglichkeit, dies zu tun, obwohl es richtig hinzubekommen schwierig sein wird . Sie können das Modul inspect
verwenden, um auf den Aufruf-Stack zuzugreifen. So können Sie sehen, wie der Code aussieht, der die Funktion genannt wird.
Der Stapel sieht ungefähr so aus:
[(<frame object at 0x107de1d38>, 'path/to/function/file.py', 6, 'func', ['\tstack = inspect.stack()\n'], 0), (<frame object at 0x107d34050>, 'path/to/calling/file.py', 17, '<module>', ['func()\n'], 0)]
Hinweis der zweiten zum letzten Eintrag: ['func()\n']
. Dies zeigt den Code, der Ihre Funktion aufruft. Auch wenn der Name der Funktion an anderer Stelle im Stack erscheint, zeigt sie immer den tatsächlichen Namen der Funktion an, egal wie sie aufgerufen wird. Sie müssen also selbst ein wenig arbeiten, um festzustellen, ob der Anruf direkt oder über eine zugewiesene Variable erfolgte.
Dies ist die einzige Möglichkeit, den Funktionsnamen zu erhalten. Python does not have a feature, um den Funktionsnamen innerhalb der Funktion selbst abzurufen.
Um klarzustellen, dass dies schwieriger als nur if func_name in stack
sein wird, habe ich die Funktion ein wenig konkretisiert, um ein paar Beispiele aus der realen Welt zu zeigen, wie eine Funktion heißen könnte und wie sie aussehen würde. Da die Funktion ihren eigenen Namen nicht bestimmen kann, ist sie oben in der Funktion fest codiert.
import inspect
def func(var=None, default=''):
my_name = 'func'
stack = inspect.stack()
func_call = stack[-1][4][0]
print func_call.rstrip() # `func_call` contains a trailing newline
# logic to determine if the name matches
# ...
# ...
x = func
func()
return_value = x(var=1)
print func()
if x():
pass
Diese Drucke:
func()
return_value = x(var=1)
print func()
None # This prints from the call, because `func()` doesn't return anything
if x():
Es ist nicht möglich. –
Ich würde das nicht versuchen. Haben Sie 1 Version, die zurückgibt, dann drucken Sie den Rückgabewert bei Bedarf an der Aufrufsite. Im Allgemeinen sollten Sie versuchen, dass Funktionen konsistent den gleichen Typ zurückgeben oder zumindest konsistent entweder einen verwendbaren Wert zurückgeben oder nicht. – Carcigenicate
im Falle der Klasse können Sie es tun, indem Sie eine Klassenvariable zuweisen. – Thameem