Apa perbedaan "argumen kata kunci" dari argumen biasa? Tidak bisakah semua argumen diteruskan sebagai name=value
ganti menggunakan sintaksis posisi?
289
Apa perbedaan "argumen kata kunci" dari argumen biasa? Tidak bisakah semua argumen diteruskan sebagai name=value
ganti menggunakan sintaksis posisi?
Jawaban:
Ada dua konsep terkait, keduanya disebut " argumen kata kunci ".
Di sisi panggilan, yang disebutkan oleh komentator lain, Anda memiliki kemampuan untuk menentukan beberapa argumen fungsi berdasarkan nama. Anda harus menyebutkannya setelah semua argumen tanpa nama ( argumen posisional ), dan harus ada nilai default untuk parameter apa pun yang tidak disebutkan sama sekali.
Konsep lainnya ada di sisi definisi fungsi: Anda dapat mendefinisikan fungsi yang mengambil parameter berdasarkan nama - dan Anda bahkan tidak harus menentukan apa nama-nama itu. Ini adalah argumen kata kunci murni , dan tidak dapat disampaikan secara posisi. Sintaksnya adalah
Setiap argumen kata kunci yang Anda masukkan ke fungsi ini akan ditempatkan ke dalam kamus yang bernama
kwargs
. Anda dapat memeriksa kunci kamus ini saat run-time, seperti ini:sumber
kwargs
atau saya dapat mengubah nama menjadi sth. sukaoptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
adalah konvensi ketika tidak ada nama yang lebih tepatAda satu fitur bahasa terakhir di mana perbedaannya penting. Pertimbangkan fungsi berikut:
The
*positional
Argumen akan menyimpan semua argumen posisi dilewatkan kefoo()
, dengan tidak ada batas untuk berapa banyak Anda dapat memberikan.The
**keywords
Argumen akan menyimpan argumen kata kunci:Dan tentu saja, Anda dapat menggunakan keduanya sekaligus:
Fitur-fitur ini jarang digunakan, tetapi kadang-kadang mereka sangat berguna, dan penting untuk mengetahui argumen mana yang posisional atau kata kunci.
sumber
*positional
dan**keywords
jika kita mengubah definisi fungsi sepertidef foo(arg1, *positional, **keywords):
. Iniarg1
posisi dan wajib. Harap dicatat bahwa posisi dalam jawaban berarti jumlah opsional dan variabel argumen posisi.foo(bar=True)
Anda, Anda bisa mendapatkan nilai yangbar = keywords.pop('bar')
sama denganbar = keywords.pop('bar', None)
. Untuk nilai default, gunakanbar = keywords.pop('bar', False)
Menggunakan argumen kata kunci sama dengan argumen normal kecuali pesanan tidak masalah. Misalnya, dua fungsi panggilan di bawah ini sama:
sumber
Argumen Posisi
Mereka tidak memiliki kata kunci sebelum mereka. Urutan itu penting!
Argumen Kata Kunci
Mereka memiliki kata kunci di bagian depan. Mereka bisa dalam urutan apa pun!
Anda juga harus tahu bahwa jika Anda menggunakan argumen default dan lalai untuk memasukkan kata kunci, maka urutannya akan penting!
sumber
func("bar", 5)
? Dan kemudian katakan bahwahello
mendapatkan nilai default3
.Ada dua cara untuk menetapkan nilai argumen ke parameter fungsi, keduanya digunakan.
Menurut Posisi. Argumen posisi tidak memiliki kata kunci dan ditetapkan terlebih dahulu.
Dengan kata kunci Argumen kata kunci memiliki kata kunci dan diberikan kedua, setelah argumen posisi.
Perhatikan bahwa Anda memiliki opsi untuk menggunakan argumen posisi.
Jika Anda tidak menggunakan argumen posisi, maka - ya - semua yang Anda tulis ternyata menjadi argumen kata kunci.
Ketika Anda memanggil suatu fungsi Anda membuat keputusan untuk menggunakan posisi atau kata kunci atau campuran. Anda dapat memilih untuk melakukan semua kata kunci jika Anda mau. Sebagian dari kita tidak membuat pilihan ini dan menggunakan argumen posisi.
sumber
Saya terkejut bahwa tidak ada yang menunjukkan bahwa seseorang dapat melewati kamus parameter argumen kunci, yang memenuhi parameter formal, seperti itu.
sumber
, **kwargs
. Itu akan menunjukkan bahwa bahkan fungsi sederhana, dengan parameter yang pasti, dapat disediakan kamus. Artinya, tidak memerlukan sesuatu yang mewah dalam definisi. MAKA Anda dapat menambahkan contoh kedua, DENGAN ** kwargs dalam definisi, dan menunjukkan bagaimana item EXTRA dalam kamus tersedia melalui itu.print 'a:%s, b:%s, c:%s' % (a, b, c)
memberikan kesalahan sintaks, namunprint('a:%s, b:%s, c:%s' % (a, b, c))
berhasil. Sesuatu dengan versi Python? Pokoknya terima kasih atas wawasan ini, sampai sekarang saya menggunakan yang lebih kikukprint('a:{}, b:{}, c:{}'.format(a, b, c))
Menggunakan Python 3 Anda dapat memiliki baik kata kunci yang dibutuhkan dan tidak dibutuhkan argumen :
Opsional : (nilai default ditentukan untuk param 'b')
Wajib (tidak ada nilai default yang ditentukan untuk param 'b'):
Ini dapat membantu dalam kasus di mana Anda memiliki banyak argumen serupa di samping satu sama lain terutama jika mereka dari jenis yang sama, dalam hal itu saya lebih suka menggunakan argumen bernama atau saya membuat kelas khusus jika argumen milik bersama.
sumber
Saya terkejut tidak ada yang menyebutkan fakta bahwa Anda dapat menggabungkan argumen posisi dan kata kunci untuk melakukan hal-hal licik seperti ini menggunakan
*args
dan**kwargs
( dari situs ini ):Ini memungkinkan Anda untuk menggunakan argumen kata kunci sewenang-wenang yang mungkin memiliki kunci yang tidak ingin Anda tentukan di muka.
sumber
Saya sedang mencari contoh yang memiliki kwarg default menggunakan anotasi tipe:
contoh:
sumber
Cukup tambahkan / tambahkan cara untuk mendefinisikan nilai default argumen yang tidak ditetapkan dalam kata-kata kunci saat memanggil fungsi:
sebut ini dengan:
Anda akan mendapatkan:
baca lebih lanjut tentang
*args
dan**kwargs
dengan python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3sumber