Mengapa kode ini melempar SyntaxError?
>>> def fun1(a="who is you", b="True", x, y):
... print a,b,x,y
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
Sementara potongan kode berikut ini berjalan tanpa kesalahan yang terlihat:
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
def myfunction(position_arguments, *arguments, **keywords):
`....`Jawaban:
Semua parameter yang diperlukan harus ditempatkan sebelum argumen default apa pun. Hanya karena mereka wajib, sedangkan argumen default tidak. Secara sintaksis, tidak mungkin bagi juru bahasa untuk memutuskan nilai mana yang cocok dengan argumen mana jika mode campuran diizinkan. A
SyntaxError
dimunculkan jika argumen tidak diberikan dalam urutan yang benar:Mari kita lihat argumen kata kunci, menggunakan fungsi Anda.
Misalkan diizinkan untuk mendeklarasikan fungsi seperti di atas, Kemudian dengan deklarasi di atas, kita dapat melakukan panggilan argumen posisi atau kata kunci berikut:
Bagaimana Anda akan menyarankan penugasan variabel dalam panggilan fungsi, bagaimana argumen default akan digunakan bersama dengan argumen kata kunci.
Referensi O'Reilly - Core-Python
Dimana fungsi ini memanfaatkan argumen default yang benar secara sintaksis untuk panggilan fungsi di atas. Panggilan argumen kata kunci terbukti bermanfaat untuk dapat memberikan argumen posisi yang tidak sesuai pesanan, tetapi, ditambah dengan argumen default, argumen tersebut juga dapat digunakan untuk "melewatkan" argumen yang hilang juga.
sumber
func1(x=1, y=2)
.**kwargs
tidak bisa membuatdef fun1(a="who is you", b="True", x, y)
atau bekerja serupa. Jika Anda menggunakandef f(**kwargs)
, Anda perlu menangani nilai default di dalam tubuh?def fun1(a="who is you", b="True", x, y)
hal yang sama diraih dengan gaya yang berbeda. jika def fun1 (** kwrgs) `maka panggilfun1({'a': 'who is you', 'b': True})
tidak perlu lewat x dan y.def foo(x=None, y)
akan diizinkan. Jadi saya masih penasaran mengapa ini tidak diizinkan oleh Python. Apakah ada alasan mendasar yang sebenarnya atau hanya "kami tidak mengizinkannya karena kami tidak mengizinkannya".Jika Anda mengizinkan ini, argumen default akan dianggap tidak berguna karena Anda tidak akan pernah dapat menggunakan nilai defaultnya, karena argumen non-default akan muncul setelahnya .
Namun dalam Python 3, Anda dapat melakukan hal berikut:
yang membuat
x
dany
hanya kata kunci sehingga Anda dapat melakukan ini:Ini bekerja karena tidak ada lagi ambiguitas. Catatan Anda masih tidak dapat melakukan
fun1(2, 2)
(yang akan menetapkan argumen default).sumber
Biarkan saya menghapus dua poin di sini:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a, b) adalah parameter posisi
(c = tidak ada) adalah parameter opsional
(r = "w") adalah parameter kata kunci
(d = []) adalah parameter daftar
(* ae) hanya untuk kata kunci
(** ab) adalah parameter var-keyword
def example(a, b, c=a,d=b):
argumen tidak ditentukan ketika nilai-nilai default disimpan, Python menghitung dan menyimpan nilai-nilai default ketika Anda mendefinisikan fungsi
c dan d tidak didefinisikan, tidak ada, ketika ini terjadi (itu hanya ada ketika fungsi dijalankan)
"a, a = b" tidak diizinkan dalam parameter.
sumber
Argumen yang diperlukan (yang tanpa default), harus di awal untuk memungkinkan kode klien hanya memasok dua. Jika argumen opsional ada di awal, itu akan membingungkan:
Apa yang akan dilakukan dalam contoh pertama Anda? Yang terakhir, x adalah "who is who", y adalah 3 dan a = "jack".
sumber