Penggunaan *args dan **kwargs
Sehingga saya mengalami kesulitan dengan konsep *args
dan **kwargs
.
Sejauh ini saya telah belajar bahwa:
*args
= daftar argumen - sebagai argumen posisi**kwargs
= dictionary - dan tombol menjadi terpisah kata kunci argumen dan nilai-nilai yang menjadi nilai-nilai dari argumen ini.
Saya don't memahami apa tugas pemrograman ini akan bermanfaat untuk.
Mungkin:
Saya pikir untuk memasukkan daftar kamus sebagai argumen dari fungsi DAN pada saat yang sama sebagai wildcard, sehingga aku dapat melewati SETIAP argumen?
Ini ada contoh sederhana untuk menjelaskan bagaimana *args
dan **kwargs
yang digunakan?
Juga tutorial yang saya temukan digunakan hanya "*" dan nama variabel.
Ini adalah *args
dan **kwargs
hanya penampung atau apakah yang anda gunakan benar-benar *args
dan **kwargs
dalam kode?
1361
11
Sintaks adalah
*
dan**
. Nama-nama*args
dan**kwargs
hanya dengan konvensi tapi ada's tidak ada kebutuhan untuk menggunakannya.Anda akan menggunakan
*args
ketika anda're tidak yakin berapa banyak argumen yang mungkin akan dilewatkan ke fungsi, yaitu hal ini memungkinkan anda melewati jumlah yang sewenang-wenang argumen untuk fungsi anda. Misalnya:Demikian pula,
**kwargs
memungkinkan anda untuk menangani bernama argumen yang anda miliki tidak didefinisikan terlebih dahulu:Anda dapat menggunakan ini bersama dengan argumen bernama terlalu. Eksplisit argumen mendapatkan nilai pertama dan kemudian segala sesuatu yang lain akan diteruskan ke
*args
dan**kwargs
. Bernama argumen datang pertama dalam daftar. Misalnya:Anda juga dapat menggunakan baik dalam fungsi yang sama tapi definisi
*args
harus terjadi sebelum**kwargs
.Anda juga dapat menggunakan
*
dan**
sintaks ketika memanggil sebuah fungsi. Misalnya:Seperti yang anda lihat dalam hal ini dibutuhkan daftar (atau tupel) dari barang dan menafsirkannya. Dengan ini pertandingan mereka untuk argumen fungsi. Tentu saja, anda bisa memiliki
*
kedua dalam definisi fungsi dan pada pemanggilan fungsi.Salah satu tempat di mana penggunaan
*args
dan**kwargs
yang cukup berguna adalah untuk subclassing.Dengan cara ini anda dapat memperpanjang perilaku Foo kelas, tanpa harus tahu terlalu banyak tentang Foo. Hal ini dapat cukup nyaman jika anda membuat program untuk sebuah API yang bisa berubah. MyFoo hanya melewati semua argumen ke Foo kelas.
Berikut ini's contoh yang menggunakan 3 jenis parameter.
Berikut ini's salah satu tempat favorit saya untuk menggunakan
**
sintaks seperti di Dave Webb's akhir contoh:I'm tidak yakin jika ini's sangat cepat bila dibandingkan dengan hanya menggunakan nama mereka sendiri, tetapi itu's jauh lebih mudah untuk mengetik!
Salah satu kasus di mana *args dan **kwargs berguna adalah ketika menulis fungsi pembungkus (seperti dekorator) yang perlu untuk dapat menerima sewenang-wenang argumen untuk melewati ke fungsi yang dibungkus. Misalnya, sederhana dekorator yang mencetak argumen dan mengembalikan nilai dari fungsi yang dibungkus:
*args dan **kwargs khusus-magic fitur Python. Berpikir tentang fungsi yang bisa memiliki jumlah yang tidak diketahui dari argumen. Misalnya, untuk alasan apapun, anda ingin memiliki fungsi yang jumlah tidak diketahui jumlah angka (dan anda don't ingin menggunakan built-in fungsi sum). Jadi anda menulis fungsi ini:
dan menggunakannya seperti: sumFunction(3,4,6,3,6,8,9).
kwargs memiliki fungsi yang berbeda. Dengan kwargs anda dapat memberikan sewenang-wenang kata kunci argumen ke fungsi tersebut dan anda dapat mengaksesnya sebagai dictonary.
Panggilan someFunction(teks="anu") akan mencetak foo.
Bayangkan anda memiliki sebuah fungsi tetapi anda don't ingin membatasi jumlah parameter yang dibutuhkan. Contoh:
Kemudian anda menggunakan fungsi ini seperti:
Nama-nama
*args
dan**kwargs
atau**kw
adalah murni oleh konvensi. Itu membuat lebih mudah bagi kita untuk membaca satu sama lain's kodeSalah satu tempat hal ini berguna ketika menggunakan struct modul
struct.membongkar()
mengembalikan sebuah tuple sedangkanstruct.pack()
menggunakan variabel jumlah argumen. Ketika memanipulasi data akan lebih mudah untuk dapat melewati sebuah tuple untukmemukul.pack()
misalnya.tanpa kemampuan ini anda akan dipaksa untuk menulis
yang juga berarti jika format_str perubahan dan ukuran tupel perubahan, saya'll harus kembali dan mengedit yang benar-benar panjang garis
Perhatikan bahwa *args/*kwargs merupakan bagian dari fungsi-panggilan sintaks, dan tidak benar-benar seorang operator. Ini memiliki efek samping tertentu yang aku berlari ke dalam, yang adalah bahwa anda dapat't digunakan args ekspansi dengan pernyataan print, sejak print bukan fungsi.
Hal ini tampaknya masuk akal:
Sayangnya itu doesn't mengkompilasi (syntax error).
Ini mengkompilasi:
Tapi mencetak argumen sebagai tuple, yang isn't apa yang kita inginkan.
Ini adalah solusi aku menetap pada:
Parameter ini biasanya digunakan untuk fungsi proxy, jadi proxy dapat melewati setiap parameter input untuk fungsi target.
Tapi karena parameter ini menyembunyikan parameter sebenarnya nama-nama itu, lebih baik untuk menghindari mereka.
Anda bisa melihat-lihat di python docs (docs.python.org di FAQ), tetapi lebih khusus untuk penjelasan yang baik misterius miss args dan mister kwargs (courtesy of archive.org) (asli, mati link ini di sini).
Singkatnya, baik digunakan ketika parameter opsional untuk fungsi atau metode yang digunakan. Sebagai Dave mengatakan, *args digunakan ketika anda don't tahu berapa banyak argumen dapat diteruskan, dan **kwargs ketika anda ingin menangani parameter yang ditentukan oleh nama dan nilai seperti dalam: