Burada pek çok soru var. En az iki, belki üç görüyorum:
- Pop (a, b) ne yapar? / Neden ikinci bir tartışma var?
- Ne
*args
için kullanılıyor?
İlk soru Python Standart Kitaplığı referansında önemsiz bir şekilde yanıtlanır :
pop (anahtar [, varsayılan])
Anahtar sözlükte ise, onu kaldırın ve değerini döndürün, aksi takdirde varsayılana dönün. Varsayılan belirtilmezse ve sözlükte anahtar yoksa, bir KeyError oluşturulur.
İkinci soru Python Dil Referansında ele alınmıştır :
"* Tanımlayıcı" formu mevcutsa, herhangi bir fazla konumsal parametre alan bir demet olarak başlatılır, varsayılan olarak boş demete ayarlanır. "** tanımlayıcı" formu mevcutsa, fazla anahtar kelime argümanlarını alan yeni bir sözlüğe başlatılır, varsayılan olarak yeni bir boş sözlüğe geçer.
Başka bir deyişle, pop
işlev en az iki argüman alır. İlk ikisine isimler verilir self
ve key
; ve geri kalanı adı verilen bir demete doldurulur args
.
*args
Çağrıda iletildiğinde bir sonraki satırda olan self.data.pop
şey bunun tersidir - tuple *args
, iletilen konumsal parametrelere genişletilir. Bu, Python Dil Referansında açıklanmıştır :
Sözdizimi * ifadesi işlev çağrısında görünürse, ifade bir sıra olarak değerlendirilmelidir. Bu dizideki öğeler, ek konumsal bağımsız değişkenlermiş gibi ele alınır.
Kısacası, a.pop()
esnek olmak ve herhangi bir sayıda konumsal parametreyi kabul etmek ister, böylece bu bilinmeyen konumsal parametreleri üzerine geçirebilir self.data.pop()
.
Bu size esneklik sağlar; şu anda data
olur dict
ve bu nedenle self.data.pop()
bir veya iki parametre alır; ancak data
, bir çağrı için 19 parametre alan bir tür self.data.pop()
olarak değiştirirseniz, sınıfınızı a
hiç değiştirmeniz gerekmez . Yine de a.pop()
gerekli 19 parametreyi geçmek için çağrılan herhangi bir kodu değiştirmeniz gerekir.
help(b.data.pop)
REPL'de gerçekten tembelseniz.