Передача значений из объемлющей области видимости с помощью автоматических ссылок

Аргументы со значениями по умолчанию способны более четко обозначить внешние зависимости, тем не менее можно обойтись и без них (начиная с версии 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

Оцените статью
Секреты программирования
Добавить комментарий