Saya tidak mengerti contoh berikut, katakanlah saya memiliki fungsi-fungsi ini:
# python likes
def save(filename, data, **kwargs):
fo = openX(filename, "w", **kwargs) # <- #1
fo.write(data)
fo.close()
# python doesnt like
def save2(filename, data, **kwargs):
fo = openX(filename, "w", kwargs) # <- #2
fo.write(data)
fo.close()
def openX(filename, mode, **kwargs):
#doing something fancy and returning a file object
Mengapa # 1 solusi yang tepat dan # 2 yang salah? **kwargs
pada dasarnya adalah dict, jadi Jika saya ingin meneruskan argumen ke openX saya pikir cara yang benar akan tanpa **
dan hanya memberikan dict. Tapi python jelas tidak suka yang kedua dan mengatakan saya memberi 3 bukannya 2 argumen. Jadi apa alasan di balik ini?
**args
dalam kode. Ini mungkin nama yang terburuk karena orang akan bingung dengan*args
Jawaban:
Dalam contoh kedua Anda memberikan 3 argumen: nama file, mode dan kamus (
kwargs
). Tapi Python mengharapkan: 2 argumen formal ditambah argumen kata kunci.Dengan mengawali kamus dengan '**' Anda membongkar kamus
kwargs
ke argumen kata kunci.Kamus (tipe
dict
) adalah variabel tunggal yang berisi pasangan nilai kunci."Argumen kata kunci" adalah parameter metode nilai kunci.
Kamus apa pun dapat dengan membongkar argumen kata kunci dengan awalan dengan
**
selama panggilan fungsi.sumber
The
**
sintaks memberitahu Python untuk argumen kata kunci collect ke dalam kamus. Inisave2
meneruskannya sebagai argumen non-kata kunci (objek kamus). TheopenX
tidak melihat argumen kata kunci sehingga**args
tidak digunakan. Alih-alih mendapatkan argumen non-kata kunci ketiga (kamus). Untuk memperbaikinya ubah definisiopenX
fungsi.sumber
Memperluas jawaban @gecco, berikut ini adalah contoh yang akan menunjukkan perbedaan:
Di sini Anda dapat melihat cara membongkar kamus berfungsi, dan mengapa mengirim kamus yang sebenarnya gagal
sumber
Karena kamus adalah nilai tunggal. Anda perlu menggunakan perluasan kata kunci jika Anda ingin meneruskannya sebagai grup argumen kata kunci.
sumber
Untuk # 2 args hanya akan menjadi parameter formal dengan nilai dict, tetapi bukan parameter jenis kata kunci.
Jika Anda ingin meneruskan parameter jenis kata kunci ke argumen kata kunci, Anda perlu menentukan ** sebelum kamus Anda, yang berarti argumen **
lihat ini untuk detail lebih lanjut tentang penggunaan ** kw
http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
sumber