Python: Bagaimana cara mendapatkan nama metode pemanggil dalam metode yang dipanggil?
Asumsikan saya memiliki 2 metode:
def method1(self):
...
a = A.method2()
def method2(self):
...
Jika saya tidak ingin melakukan perubahan apa pun untuk method1, bagaimana cara mendapatkan nama pemanggil (dalam contoh ini, namanya adalah method1) di method2?
python
introspection
zs2020
sumber
sumber
Jawaban:
inspect.getframeinfo dan fungsi terkait lainnya di
inspect
dapat membantu:introspeksi ini dimaksudkan untuk membantu debugging dan pengembangan; tidak disarankan untuk mengandalkannya untuk tujuan fungsionalitas produksi.
sumber
Versi lebih pendek:
(dengan terima kasih kepada @Alex, dan Stefaan Lippen )
sumber
Ini sepertinya bekerja dengan baik:
sumber
inspect.stack
sys
modul mendapat beberapa refactoring berat.Saya datang dengan versi yang sedikit lebih panjang yang mencoba membangun nama metode lengkap termasuk modul dan kelas.
https://gist.github.com/2151727 (rev 9cccbf)
sumber
stack
, itu masih bocor frame karena ref cirular seperti yang dijelaskan dalamSaya akan menggunakan
inspect.currentframe().f_back.f_code.co_name
. Penggunaannya belum tercakup dalam salah satu jawaban sebelumnya yang sebagian besar dari salah satu dari tiga jenis:inspect.stack
tetapi diketahui terlalu lambat .sys._getframe
fungsi pribadi internal yang diberi garis bawah utama, dan penggunaannya secara implisit tidak disarankan.inspect.getouterframes(inspect.currentframe(), 2)[1][3]
tetapi sama sekali tidak jelas apa[1][3]
yang diakses.Catatan yang
cast(FrameType, frame)
digunakan untuk memuaskanmypy
.Ucapan terima kasih: komentar sebelumnya oleh 1313e untuk jawaban .
sumber
Sedikit penggabungan dari hal-hal di atas. Tapi ini celah saya.
Menggunakan:
output adalah
sumber
modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, min(stack_size, len(inspect.stack()))))]
untuk mendapatkan modul.Saya menemukan cara jika Anda akan melintasi kelas dan ingin kelas metode milik DAN metode. Dibutuhkan sedikit pekerjaan ekstraksi tetapi itu membuat titik. Ini berfungsi dalam Python 2.7.13.
sumber
sumber