Стільки питань тут. Я бачу принаймні два, а може три:
- Що робить pop (a, b)? / Чому є другий аргумент?
- Для
*args
чого використовується?
На перше запитання тривіально відповідає посилання на Стандартну бібліотеку Python :
поп (клавіша [, за замовчуванням])
Якщо ключ є у словнику, видаліть його та поверніть його значення, інакше поверніть за замовчуванням. Якщо за замовчуванням не вказано, а ключа немає у словнику, піднімається помилка KeyError.
Друге питання висвітлюється в Довідковій мові Python :
Якщо форма «ідентифікатор *» присутня, вона ініціалізується кортежем, що отримує будь-які надлишкові позиційні параметри, за замовчуванням порожнім кортежем. Якщо форма “** ідентифікатор” присутня, вона ініціалізується в новий словник, що отримує будь-які надлишкові аргументи ключового слова, за замовчуванням новий порожній словник.
Іншими словами, pop
функція приймає принаймні два аргументи. Першим двом присвоюються імена self
та key
; а решта набиваються в кортеж під назвою args
.
Те, що відбувається в наступному рядку, коли *args
його передають у виклику, self.data.pop
є зворотним до цього - кортеж *args
розширюється до позиційних параметрів, які передаються. Це пояснюється в Довідковій мові Python :
Якщо вираз синтаксису * з'являється у виклику функції, вираз повинен перетворитися на послідовність. Елементи з цієї послідовності трактуються так, ніби вони є додатковими позиційними аргументами
Коротше кажучи, a.pop()
хоче бути гнучким і приймати будь-яку кількість позиційних параметрів, щоб він міг передати цю невідому кількість позиційних параметрів self.data.pop()
.
Це дає вам гнучкість; data
трапляється dict
зараз, і тому self.data.pop()
приймає один або два параметри; але якщо ви data
перейшли на тип, який приймав 19 параметрів для дзвінка, self.data.pop()
вам взагалі не доведеться змінювати клас a
. Вам все одно доведеться змінити будь-який код, який викликав, a.pop()
щоб передати необхідні 19 параметрів.
help(b.data.pop)
в REPL.