Burada pek çok soru var. En az iki, belki üç görüyorum:
- Pop (a, b) ne yapar? / Neden ikinci bir tartışma var?
- Ne
*argsiç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, popişlev en az iki argüman alır. İlk ikisine isimler verilir selfve 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 dataolur dictve 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ı ahiç 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.