Begitu banyak pertanyaan di sini. Saya melihat setidaknya dua, mungkin tiga:
- Apa yang dilakukan pop (a, b)? / Mengapa ada argumen kedua?
- Untuk apa
*argsdigunakan?
Pertanyaan pertama dijawab dengan mudah dalam referensi Python Standard Library :
pop (kunci [, default])
Jika kunci ada dalam kamus, hapus dan kembalikan nilainya, jika tidak kembalikan default. Jika default tidak diberikan dan key tidak ada dalam kamus, KeyError akan dimunculkan.
Pertanyaan kedua tercakup dalam Referensi Bahasa Python :
Jika bentuk "* pengenal" ada, ini diinisialisasi ke tupel yang menerima parameter posisi berlebih, default ke tupel kosong. Jika formulir "** pengenal" ada, ini diinisialisasi ke kamus baru yang menerima argumen kata kunci berlebih, default ke kamus kosong baru.
Dengan kata lain, popfungsi tersebut membutuhkan setidaknya dua argumen. Dua yang pertama diberi nama selfdan key; dan sisanya dimasukkan ke dalam tupel yang disebut args.
Apa yang terjadi di baris berikutnya ketika *argsditeruskan dalam panggilan ke self.data.popadalah kebalikan dari ini - tupel *argsdiperluas ke parameter posisi yang diteruskan. Ini dijelaskan dalam Referensi Bahasa Python :
Jika ekspresi sintaks * muncul dalam pemanggilan fungsi, ekspresi harus mengevaluasi ke sebuah urutan. Elemen dari urutan ini diperlakukan seolah-olah merupakan argumen posisi tambahan
Singkatnya, a.pop()ingin fleksibel dan menerima sejumlah parameter posisi, sehingga dapat meneruskan sejumlah parameter posisi yang tidak diketahui ini ke self.data.pop().
Ini memberi Anda fleksibilitas; datakebetulan menjadi a dictsekarang, dan dengan demikian self.data.pop()mengambil salah satu atau dua parameter; tetapi jika Anda berubah datamenjadi tipe yang mengambil 19 parameter untuk panggilan, self.data.pop()Anda tidak perlu mengubah kelas asama sekali. Anda masih harus mengubah kode apa pun yang dipanggil a.pop()untuk melewati 19 parameter yang diperlukan.
help(b.data.pop)di REPL.