Python: Jak uzyskać nazwę metody wywołującej w wywoływanej metodzie?
Załóżmy, że mam 2 metody:
def method1(self):
...
a = A.method2()
def method2(self):
...
Jeśli nie chcę wprowadzać żadnych zmian dla metody 1, jak uzyskać nazwę osoby dzwoniącej (w tym przykładzie nazwa to metoda 1) w metodzie 2?
python
introspection
zs2020
źródło
źródło
Odpowiedzi:
inspect.getframeinfo i inne powiązane funkcje
inspect
mogą pomóc:ta introspekcja ma na celu pomóc w debugowaniu i rozwoju; nie jest wskazane poleganie na nim do celów związanych z produkcją.
źródło
Krótsza wersja:
(dzięki dzięki @Alex i Stefaan Lippen )
źródło
To wydaje się działać dobrze:
źródło
inspect.stack
sys
moduł ulegnie ciężkiej refaktoryzacji.Wymyśliłem nieco dłuższą wersję, która próbuje zbudować pełną nazwę metody, w tym moduł i klasę.
https://gist.github.com/2151727 (rev 9cccbf)
źródło
stack
, nadal przecieka ramki z powodu cyrkularnych odniesień, jak wyjaśniono w inspect-docsChciałbym użyć
inspect.currentframe().f_back.f_code.co_name
. Jego zastosowanie nie zostało uwzględnione w żadnej z wcześniejszych odpowiedzi, które są głównie jednego z trzech rodzajów:inspect.stack
ale wiadomo, że są zbyt wolne .sys._getframe
która jest wewnętrzną funkcją prywatną, biorąc pod uwagę jej wiodący znak podkreślenia, więc jej użycie jest pośrednio odradzane.inspect.getouterframes(inspect.currentframe(), 2)[1][3]
ale nie jest całkowicie jasne, do czego[1][3]
można uzyskać dostęp.Uwaga:
cast(FrameType, frame)
służy do spełnieniamypy
.Podziękowania: wcześniejszy komentarz 1313e w celu uzyskania odpowiedzi .
źródło
Trochę połączenia powyższych rzeczy. Ale oto mój problem.
Posługiwać się:
wyjście jest
źródło
modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, min(stack_size, len(inspect.stack()))))]
aby uzyskać moduły.Znalazłem sposób, jeśli przechodzisz przez klasy i chcesz klasy, do której należy metoda ORAZ metoda. Wymaga trochę pracy przy wydobywaniu, ale ma sens. Działa to w Pythonie 2.7.13.
źródło
źródło