Аргументы со значениями по умолчанию способны более четко обозначить внешние зависимости, тем не менее можно обойтись и без них (начиная с версии Python 2.2, по крайней мере), и в современной практике они обычно не используются для этих целей. Вместо этого просто создается lambda-выражение, которое откладывает вызов действительного обработчика и передает ему дополнительные аргументы. Переменные из объемлющей области видимости, используемые в lambda-выражении, автоматически сохраняются даже после выхода из объемлющей функции.
Предыдущий фрагмент, например, в наши дни можно записать, как мы уже делали это выше — имя X в обработчике автоматически будет отображено в переменную X из объемлющей области видимости, что фактически приводит к сохранению значения, которое имела переменная X на момент создания кнопки:
def makegui(): # X запоминается
X = 42 # автоматически
Button(text=’ni’, command=(lambda: handler(X, ‘spam’))) # аргументы по
# умолчанию не # нужны
Далее мы увидим более конкретные примеры использования этого приема. При использовании классов для создания графического интерфейса, например, аргумент self является для методов локальной переменной и потому автоматически становится доступным в теле lambda— выражения. Нет никакой необходимости передавать его явно, в виде аргумента со значением по умолчанию:
class Gui:
def handler(self, A, B):
…использование self, A и B…
def makegui(self): X = 42 Button(text=’ni’, command=(lambda: self.handler(X, ‘spam’)))
Gui().makegui()
mainloop()
Однако при использовании классов в качестве источника дополнительной информации для функций обратного вызова можно использовать атрибуты экземпляров и отказаться от дополнительных аргументов. Как это делается, мы увидим чуть ниже. Но сначала нам следует отклониться от темы и рассмотреть правила областей видимости в Python, чтобы понять, почему аргументы со значениями по умолчанию иногда все же бывают необходимы для передачи значений во вложенные lambda-функции, особенно в графических интерфейсах.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011