Saat memprogram Python saya terkadang melakukan a **
untuk melakukan konversi. Saya mengerti apa yang dilakukannya tetapi struktur data apa yang saya manipulasi? A dict
dan apa yang lainnya? Sebuah array
? Apakah ada nama untuk **
operator?
python
operators
type-conversion
Niklas Rosencrantz
sumber
sumber
**
. Kekuatan dan "kamus argumen kata kunci". Apa yang kamu bicarakan? Dokumentasi memiliki kata-kata ini: "Jika bentuk" ** pengenal "ada, ini diinisialisasi ke kamus baru yang menerima argumen kata kunci berlebih, default ke kamus kosong baru." Mana di antara mereka yang tampaknya relevan dengan pertanyaan Anda?Jawaban:
Ini bukan operator, jadi tidak benar - benar memiliki nama, tetapi didefinisikan sebagai "aturan sintaksis" . Jadi itu harus disebut:
Jika Anda memiliki daftar argumen,,
*args
itu disebut "argument unpacking" , dengan cara yang sama**kwargs
disebut "argumen argumen unpacking" .Jika Anda menggunakannya di sisi kiri
=
, seperti padaa, *middle, end = my_tuple
, Anda akan mengatakan "tuple unpacking" .Secara total, ada tiga jenis argumen (parameter tunggal):
The
*args
argumen disebut "variabel posisi parameter" dan**kwargs
adalah "parameter kunci variabel". Argumen khusus kata kunci tidak dapat diberikan secara posisi, karena parameter posisi variabel akan mengambil semua argumen yang Anda berikan.Sebagian besar ini dapat ditemukan di PEPs 0362 dan 3102 , serta di bagian Aliran Kontrol dokumen. Perlu dicatat bahwa objek tanda tangan fungsi PEP hanya konsep, dan terminologi mungkin hanya ide satu orang. Tapi toh itu istilah yang bagus. :)
Jadi argumen
*
dan**
hanya membongkar struktur data masing-masing:[1]: Iterables adalah objek yang mengimplementasikan
__iter__()
metode dan pemetaan adalah objek yang mengimplementasikankeys()
dan__getitem__()
. Setiap objek yang mendukung protokol ini akan dipahami oleh konstruktortuple()
dandict()
, sehingga mereka dapat digunakan untuk membongkar argumen.sumber
def f(x, *xs, y=0): pass
sintaks Python 2. {5,6,7} tidak valid, juga tidakdef f(x, y=0, *xs):
melakukan apa yang Anda harapkan. AFAIK, satu-satunya cara untuk mencapai efek (yang jelas) yang dimaksud adalahdef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. Python 3 menangani sintaks asli seperti yang diharapkan.begin, *middle, end = (0, 1, 2, 3, 4, 5)
sintaksnya juga tidak berfungsi di Python 2.x.Saya tidak berpikir itu memiliki nama. Dalam Python Docs di bawah "Unpacking Argument Lists", itu hanya disebut sebagai "
**
-operator."Saya tidak yakin apa yang Anda maksud dengan struktur data "yang lain". Ketika Anda melakukannya,
f(**kwargs)
Anda membongkar kamuskwargs
sebagai urutan pasangan kunci-nilai. Saya tidak melihat ada struktur lain yang terlibat.Saya akan menyalin contoh dalam dokumentasi di atas untuk kejelasan.
Lihat juga: Apa arti * args dan ** kwargs?
sumber
f(**kwargs)
...Jika Anda tidak yakin apa yang harus memanggil operator tertentu atau jika tidak disebutkan namanya, Anda selalu dapat menggunakan Waka Waka Bang Splat sebagai referensi untuk membantu Anda mencari tahu apa yang memanggilnya. Dalam hal ini
**
saya akan menyebutnyadouble-splat
, meskipun ada beberapa nama alternatif untuk simbol .sumber