Apa perbedaan "argumen kata kunci" dari argumen biasa? Tidak bisakah semua argumen diteruskan sebagai name=value
ganti menggunakan sintaksis posisi?
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
def my_function(arg1, arg2, **kwargs)
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:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
kwargs
atau saya dapat mengubah nama menjadi sth. suka options
( def my_fuction(arg1, arg2, **options)
)?
kwargs
adalah konvensi ketika tidak ada nama yang lebih tepat
Ada satu fitur bahasa terakhir di mana perbedaannya penting. Pertimbangkan fungsi berikut:
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
The *positional
Argumen akan menyimpan semua argumen posisi dilewatkan ke foo()
, dengan tidak ada batas untuk berapa banyak Anda dapat memberikan.
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
The **keywords
Argumen akan menyimpan argumen kata kunci:
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
Dan tentu saja, Anda dapat menggunakan keduanya sekaligus:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
Fitur-fitur ini jarang digunakan, tetapi kadang-kadang mereka sangat berguna, dan penting untuk mengetahui argumen mana yang posisional atau kata kunci.
*positional
dan **keywords
jika kita mengubah definisi fungsi seperti def foo(arg1, *positional, **keywords):
. Ini arg1
posisi dan wajib. Harap dicatat bahwa posisi dalam jawaban berarti jumlah opsional dan variabel argumen posisi.
foo(bar=True)
Anda, Anda bisa mendapatkan nilai yang bar = keywords.pop('bar')
sama dengan bar = 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:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
Mereka tidak memiliki kata kunci sebelum mereka. Urutan itu penting!
func(1,2,3, "foo")
Mereka memiliki kata kunci di bagian depan. Mereka bisa dalam urutan apa pun!
func(foo="bar", baz=5, hello=123)
func(baz=5, foo="bar", hello=123)
Anda juga harus tahu bahwa jika Anda menggunakan argumen default dan lalai untuk memasukkan kata kunci, maka urutannya akan penting!
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
func("bar", 5)
? Dan kemudian katakan bahwa hello
mendapatkan nilai default 3
.
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.
Saya terkejut bahwa tidak ada yang menunjukkan bahwa seseorang dapat melewati kamus parameter argumen kunci, yang memenuhi parameter formal, seperti itu.
>>> def func(a='a', b='b', c='c', **kwargs):
... print 'a:%s, b:%s, c:%s' % (a, b, c)
...
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>>
, **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, namun print('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')
def func1(a, *, b=42):
...
func1(value_for_a) # b is optional and will default to 42
Wajib (tidak ada nilai default yang ditentukan untuk param 'b'):
def func2(a, *, b):
...
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: '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.
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 ):
def test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
Ini memungkinkan Anda untuk menggunakan argumen kata kunci sewenang-wenang yang mungkin memiliki kunci yang tidak ingin Anda tentukan di muka.
Saya sedang mencari contoh yang memiliki kwarg default menggunakan anotasi tipe:
def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
return ' '.join([a, b, c, str(kwargs)])
contoh:
>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}
Cukup tambahkan / tambahkan cara untuk mendefinisikan nilai default argumen yang tidak ditetapkan dalam kata-kata kunci saat memanggil fungsi:
def func(**keywargs):
if 'my_word' not in keywargs:
word = 'default_msg'
else:
word = keywargs['my_word']
return word
sebut ini dengan:
print(func())
print(func(my_word='love'))
Anda akan mendapatkan:
default_msg
love
baca lebih lanjut tentang *args
dan **kwargs
dengan python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3