Apa yang dilakukan tanda bintang kosong pada argumen fungsi?
Ketika saya melihat modul acar , saya melihat ini:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Saya tahu tentang tanda bintang tunggal dan ganda sebelum argumen (untuk jumlah variabel argumen), tetapi ini tidak mendahului apa pun. Dan saya cukup yakin ini tidak ada hubungannya dengan acar. Itu mungkin hanya contoh dari kejadian ini. Saya baru tahu namanya ketika saya mengirim ini ke penerjemah:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Jika itu penting, saya menggunakan python 3.3.0.
Jawaban:
Bare
*
digunakan untuk memaksa penelepon menggunakan argumen bernama - jadi Anda tidak dapat mendefinisikan fungsi dengan*
sebagai argumen ketika Anda tidak memiliki argumen kata kunci berikut.Lihat jawaban ini atau dokumentasi Python 3 untuk lebih jelasnya.
sumber
*args
, harus muncul sebelum bare*
.*
ada di tempat*args
, dan sebaliknya; mereka tidak bisa hidup berdampingan dalam tanda tangan. Itu sebabnya mereka memilih*
; sebelumnya,*args
adalah satu-satunya cara untuk memaksakan argumen posisi murni, dan itu menandai akhir argumen yang dapat diajukan secara posisi (karena mengumpulkan semua argumen posisi yang tersisa, mereka dapat mencapai argumen bernama berikut).*
berarti "argumen posisi yang sama tidak dapat melampaui sini", tetapi kurangnya nama berarti "tetapi saya tidak akan menerimanya sama sekali, karena saya memilih untuk tidak menyediakan tempat untuk meletakkannya".Sementara jawaban asli menjawab pertanyaan sepenuhnya, hanya menambahkan sedikit informasi terkait. Perilaku untuk asterisk tunggal berasal dari
PEP-3102
. Mengutip bagian terkait:Dalam bahasa Inggris yang sederhana, ini berarti bahwa untuk meneruskan nilai kunci, Anda harus secara eksplisit meneruskannya sebagai
key="value"
.sumber
*
adalah melahap argumen posisi yang tersisa, tapi bukan itu masalahnya. Melewati argumen posisi ekstra dari fungsi yang diharapkan, memberikan kesalahan seperti ini:foo() takes exactly 1 positional argument (2 given)
contoh di atas dengan ** kwargs
sumber
Secara semantik, itu berarti argumen yang mengikutinya hanya kata kunci, jadi Anda akan mendapatkan kesalahan jika Anda mencoba memberikan argumen tanpa menyebutkan namanya. Sebagai contoh:
Secara pragmatis, itu berarti Anda harus memanggil fungsi dengan argumen kata kunci. Ini biasanya dilakukan ketika akan sulit untuk memahami tujuan argumen tanpa petunjuk yang diberikan oleh nama argumen.
Bandingkan misalnya
sorted(nums, reverse=True)
vs. jika Anda menulissorted(nums, True)
. Yang terakhir akan jauh lebih mudah dibaca, sehingga pengembang Python memilih untuk membuat Anda menulis dengan cara sebelumnya.sumber
Misalkan Anda memiliki fungsi:
Anda dapat memanggil fungsi ini dalam 2 cara:
sum(1,2)
atausum(1,key=2)
Misalkan Anda ingin berfungsi
sum
dipanggil hanya menggunakan argumen kata kunci.Anda menambahkan
*
ke daftar parameter fungsi untuk menandai akhir argumen posisi.Jadi fungsinya didefinisikan sebagai:
dapat disebut hanya menggunakan
sum(1,key=2)
sumber
Saya menemukan tautan berikut ini sangat membantu menjelaskan
*
,*args
dan**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
Intinya, selain jawaban di atas, saya sudah belajar dari situs di atas (kredit: https://pythontips.com/author/yasoob008/ ) berikut ini:
Dengan fungsi demonstrasi didefinisikan pertama di bawah ini, ada dua contoh, satu dengan
*args
dan satu dengan**kwargs
Jadi
*args
memungkinkan Anda untuk secara dinamis membangun daftar argumen yang akan diambil sesuai urutan pemberiannya**kwargs
dapat memungkinkan berlalunya argumen NAMED, dan dapat diproses oleh NAME sesuai (terlepas dari urutan pemberiannya) .Situs berlanjut, mencatat bahwa urutan argumen yang benar adalah:
sumber