Стільки питань тут. Я бачу принаймні два, а може три:
- Що робить 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.