Dengan Python, bagaimana cara mendapatkan nama fungsi sebagai string, tanpa memanggil fungsi?
def my_function():
pass
print get_function_name_as_string(my_function) # my_function is not in quotes
harus keluar "my_function"
.
Apakah fungsi tersebut tersedia dalam Python? Jika tidak, ada ide tentang cara mengimplementasikan get_function_name_as_string
, dengan Python?
Jawaban:
Menggunakan
__name__
adalah metode yang disukai karena berlaku secara seragam. Tidak sepertifunc_name
itu, ini juga berfungsi pada fungsi bawaan:Juga garis bawah ganda menunjukkan kepada pembaca ini adalah atribut khusus. Sebagai bonus, kelas dan modul memiliki
__name__
atribut juga, jadi Anda hanya perlu mengingat satu nama khusus.sumber
def wrapper(kwargs): super(ExtendedClass,self).call('wrapper', kwargs)
. Anda memiliki pilihan lain, yaitu:def wrapper(kwargs): super(ExtendedClass,self).call(sys._getframe().f_code.co_name, kwargs)
. Jadi, jawaban dari Albert Vonpupp terlihat lebih baik bagi saya.f.__name__ == 'f'
.Untuk mendapatkan nama fungsi atau metode saat ini dari dalamnya, pertimbangkan:
sys._getframe
juga berfungsi alih-alihinspect.currentframe
meskipun yang terakhir menghindari mengakses fungsi pribadi.Untuk mendapatkan nama fungsi panggilan, pertimbangkan
f_back
sebagai dalaminspect.currentframe().f_back.f_code.co_name
.Jika juga menggunakan
mypy
, itu bisa mengeluh bahwa:Untuk menekan kesalahan di atas, pertimbangkan:
sumber
sys._getframe
- itu terhubung langsung ke internal CPython.sys._getframe(1).f_code.co_name
, sehingga Anda dapat mendefinisikan fungsi sepertiget_func_name()
dan berharap untuk mendapatkan nama fungsi yang diinginkan yang dipanggil.Ada juga sifat-sifat fungsi yang menyenangkan lainnya. Ketik
dir(func_name)
untuk mendaftar mereka.func_name.func_code.co_code
adalah fungsi yang dikompilasi, disimpan sebagai string.akan menampilkan kode dalam format yang hampir dapat dibaca manusia. :)
sumber
__names__
bersifat pribadi,__names
khusus._names
pribadi (garis bawah tunggal sebelum, hanya sebuah konvensi),__names__
adalah istimewa (garis bawah dua kali sebelum dan sesudah). Tidak yakin apakah menggarisbawahi sebelumnya memiliki makna, secara formal atau sebagai konvensi.func_name
tidak ada lagi di python3 sehingga Anda perlu menggunakanfunc.__name__
jika Anda ingin kompatibilitasFungsi ini akan mengembalikan nama fungsi pemanggil.
Ini seperti jawaban Albert Vonpupp dengan bungkus yang ramah.
sumber
Jika Anda tertarik dalam metode kelas juga, Python 3.3+ memiliki
__qualname__
selain__name__
.sumber
Saya suka menggunakan fungsi dekorator. Saya menambahkan kelas, yang juga kali fungsi waktu. Asumsikan gLog adalah python logger standar:
jadi sekarang yang harus Anda lakukan dengan fungsi Anda adalah menghiasnya dan voila
sumber
dimana
stack () [0] pemanggil
stack () [3] nama string dari metode ini
sumber
stack()[0]
akan selalu menjadi penelepon,[3]
nama string dari metode ini.Sebagai perpanjangan dari jawaban @ Demyn , saya membuat beberapa fungsi utilitas yang mencetak nama fungsi saat ini dan argumen fungsi saat ini:
sumber
sys._getframe()
tidak dijamin tersedia di semua implementasi Python ( lihat ref ), Anda dapat menggunakantraceback
modul untuk melakukan hal yang sama, misalnya.Panggilan ke
stack[-1]
akan mengembalikan detail proses saat ini.sumber
sys._getframe()
tidak ditentukan, makatraceback.extract_stack
juga tidak bisa dioperasikan. Yang terakhir memberikan superset kasar dari fungsionalitas yang pertama; Anda tidak dapat berharap melihat satu tanpa yang lain. Dan pada kenyataannya, di IronPython 2.7extract_stack()
selalu kembali[]
. -1Anda hanya ingin mendapatkan nama fungsinya di sini adalah kode sederhana untuk itu. katakanlah Anda memiliki fungsi-fungsi ini didefinisikan
outputnya adalah function1
Sekarang katakanlah Anda memiliki fungsi-fungsi ini dalam daftar
untuk mendapatkan nama fungsi
hasilnya akan
function1
function2
function3
sumber
Saya telah melihat beberapa jawaban yang menggunakan dekorator, meskipun saya merasa beberapa agak bertele-tele. Berikut adalah sesuatu yang saya gunakan untuk nama fungsi logging dan juga nilai input dan output masing-masing. Saya telah mengadaptasinya di sini untuk hanya mencetak info daripada membuat file log dan mengadaptasinya untuk diterapkan pada contoh spesifik OP.
Keluaran:
sumber
debug
fungsi setelah Anda dapat menambahkan fungsionalitas dengan hanya menambahkan dekorator ke fungsi apa pun yang Anda butuhkan atau ingin mencetak nama fungsi. Tampaknya menjadi yang termudah dan paling mudah beradaptasi.