Bagaimana saya bisa menemukan jumlah argumen dari fungsi Python? Saya perlu tahu berapa banyak argumen normal yang dimilikinya dan berapa banyak argumen yang dinamai.
Contoh:
def someMethod(self, arg1, kwarg1=None):
pass
Metode ini memiliki 2 argumen dan 1 argumen bernama.
inspect
modul perpustakaan standar.inspect
modul memiliki banyak fitur lainnya, sehingga tidak adil untuk mengatakan bahwa seluruh modul akan dibenarkan jika salah satu fungsi tertentu di itu. Selain itu, mudah untuk melihat bagaimana fitur ini dapat digunakan dengan buruk. (Lihat stackoverflow.com/questions/741950 ). Yang mengatakan, itu adalah fitur yang berguna, terutama untuk menulis dekorator dan fungsi lain yang beroperasi pada fungsi.Jawaban:
Jawaban yang diterima sebelumnya telah ditinggalkan pada
Python 3.0
. Alih-alih menggunakaninspect.getargspec
Anda sekarang harus memilihSignature
kelas yang menggantikannya.Membuat tanda tangan untuk fungsi itu mudah melalui
signature
fungsi :Sekarang, Anda dapat melihat parameternya dengan cepat dengan
str
memasukkannya:atau Anda juga bisa mendapatkan pemetaan nama atribut ke objek parameter via
sig.parameters
.Selain itu, Anda dapat menghubungi
len
disig.parameters
untuk juga melihat jumlah argumen fungsi ini membutuhkan:Setiap entri dalam
params
pemetaan sebenarnya adalahParameter
objek yang memiliki atribut lebih lanjut yang membuat hidup Anda lebih mudah. Misalnya, mengambil parameter dan melihat nilai defaultnya sekarang dengan mudah dilakukan dengan:sama untuk sisa benda yang ada di
parameters
.Sedangkan untuk
2.x
pengguna Python , sementarainspect.getargspec
tidak ditinggalkan, bahasa akan segera menjadi :-). TheSignature
kelas tidak tersedia di2.x
seri dan tidak akan. Jadi, Anda masih perlu bekerja samainspect.getargspec
.Adapun transisi antara Python 2 dan 3, jika Anda memiliki kode yang bergantung pada antarmuka
getargspec
di Python 2 dan beralih kesignature
dalam3
terlalu sulit, Anda memiliki opsi berharga untuk menggunakaninspect.getfullargspec
. Ia menawarkan antarmuka yang mirip dengangetargspec
(satu argumen yang bisa dipanggil) untuk mendapatkan argumen dari suatu fungsi sambil juga menangani beberapa kasus tambahan yanggetargspec
tidak:Seperti halnya
getargspec
,getfullargspec
mengembalikanNamedTuple
yang berisi argumen.sumber
co_argcount
atribut.)getfullargspec
tidak diimplementasikan dalam Python 2.x, Anda perlu menggunakangetargspec
getargspec
tidak bekerja pada fungsigetargspec(open)
TypeError: <built-in function open> is not a Python function
print(args)
Anda tidak mendapatkandefaults=(None,)
Andadefaults=None
.lihat modul inspeksi
sumber
inspect.signature
- docs.python.org/3/library/inspect.html#inspect.signatureatau, jika nama fungsi saat ini tidak ditentukan:
sumber
dir(someMethod)
->'func_code'
; Lebih jauh:dir(someMethod.func_code)
->'co_argcount'
; Anda dapat menggunakan bawaandir()
untuk menentukan metode yang tersedia dari suatu objek.six.get_function_code(someMethod).co_argcount
some_method.__code__.co_argcount
co_argcount
digunakan secara internal selama evaluasi objek kode. Yang ingin saya katakan adalah, benar-benar tidak ada jaminan bahwa atribut ini tidak akan berubah dari satu rilis ke rilis lainnya.inspect.getargspec ()
Lihat can-you-list-the-keyword-argumen-a-python-function-accept .
sumber
Menambahkan ke atas, saya juga melihat bahwa sebagian besar kali help () function sangat membantu
Misalnya, memberikan semua detail tentang argumen yang diperlukan.
berikan di bawah ini
sumber
help
fungsi hanya menunjukkan apa yang dikatakan docstring. Pernahkah Anda menguji apakah itu berfungsi dengan definisi fungsi dalam pertanyaan?help()
meludahkan lebih dari sekedar docstring - bahkan pada kode tidak berdokumen itu masih mencetak argspec dan memberi tahu Anda di mana kode itu didefinisikan. Orang yang memposting pertanyaan asli tidak jelas apakah mereka membutuhkan jawaban yang ramah mesin atau manusia. Jika hanya perlu ramah manusia, ituhelp()
sudah cukup memadai.help()
kembali apa pun , dan mencoba dan menemukanargs
dankwargs
.Kabar baik bagi orang-orang yang ingin melakukan ini dengan cara yang portabel antara Python 2 dan Python 3.6+: gunakan
inspect.getfullargspec()
metode. Ia bekerja di kedua Python 2.x dan 3.6+Seperti yang ditunjukkan oleh Jim Fasarakis Hilliard dan yang lainnya, dulunya seperti ini:
1. Dalam Python 2.x: gunakan
inspect.getargspec()
2. Dalam Python 3.x: gunakan tanda tangan, seperti
getargspec()
dangetfullargspec()
sudah ditinggalkan.Namun, mulai Python 3.6 (berdasarkan permintaan populer?), Banyak hal telah berubah menjadi lebih baik:
Dari halaman dokumentasi Python 3 :
sumber
inspect.getargspec () untuk memenuhi kebutuhan Anda
sumber
Seperti jawaban lain menyarankan,
getargspec
berfungsi dengan baik selama hal yang ditanyakan sebenarnya adalah fungsi. Ini tidak bekerja untuk built-in fungsi sepertiopen
,len
, dll, dan akan melemparkan pengecualian dalam kasus seperti:Fungsi di bawah ini (terinspirasi oleh jawaban ini ) menunjukkan solusi. Ini mengembalikan jumlah args yang diharapkan oleh
f
:Idenya adalah untuk mengurai spesifikasi fungsi dari
__doc__
string. Jelas ini bergantung pada format kata string sehingga hampir tidak kuat!sumber
func.__code__.co_argcount
memberikan jumlah setiap argumen SEBELUM*args
func.__kwdefaults__
memberi Anda argumen kata kunci SETELAH*args
func.__code__.co_kwonlyargcount
adalah sama denganlen(func.__kwdefaults__)
func.__defaults__
memberi Anda nilai argumen opsional yang muncul sebelumnya*args
Inilah ilustrasi sederhana:
sumber
Di:
Di luar:
Catatan: Jika xyz tidak berada di dalam kelas X dan tidak memiliki "diri" dan hanya "a, b, c", maka itu akan dicetak 3.
Untuk python di bawah 3.5, Anda mungkin ingin mengganti
inspect.getfullargspec
denganinspect.getargspec
kode di atas.sumber