Я перехожу из Ruby в Python для проекта. Я ценю тот факт, что Python имеет первоклассные функции и закрытие, поэтому этот вопрос должен быть легким. Я просто не понял, что является идиоматически правильным для Python:
В Ruby я мог бы написать:
def with_quietude(level, &block)
begin
saved_gval = gval
gval = level
yield
ensure
gval = saved_gval
end
end
и назовите его следующим образом:
with_quietude(3) {
razz_the_jazz
begin_the_beguine
}
(Примечание. Я не спрашиваю о обработке Python try/finally
, а также о сохранении и восстановлении переменных. Мне просто нужен нетривиальный пример обертывания блока внутри какого-либо другого кода.)
Обновление
Или, поскольку некоторые ответы навешены на глобальных назначениях в предыдущем примере, когда я действительно спрашиваю о закрытии, что, если вызов был следующим? (Обратите внимание, что это не меняет определение with_quietude):
def frumble(x)
with_quietude {
razz_the_jazz(x)
begin_the_beguine(2 * x)
}
end
Как бы вы реализовали нечто подобное в Python (и не рассмеялись экспертами Python)?