История изменений
Исправление Virtuos86, (текущая версия) :
Шо, опять объяснять?
Не понял, про какие лямбды идет речь, как и этот пассаж:
в руби емнип никакого with нет, но все прекрасно реализуется на лямбдах. Передаем что-то в функцию, вызов который оборачиваем чем угодно. Вот и весь ваш with.
Википедия описывает RAII так.
Юзкейс для with как менеджера контекста иллюстрирует типовой пример:
f = open("file")
try:
# выполняем какие-то манипуляции с открытым файлом
…
finally:
# ветка `finally` гарантированно выполняется, и мы гарантированно закрываем файл
f.close()
context manager
.Вышеприведенный пример, будучи переписан, выглядит так:
with f = open("file"):
# выполняем какие-то манипуляции с открытым файлом
…
Понятное дело, под капотом всё та же кака с try/finally, но ее нужно писать только один раз — в самом менеджере контекста, а в остальном коде будет ляпота (осторожно, паста):
@contextmanager
def stdout_redirected(new_stdout):
save_stdout = sys.stdout
sys.stdout = new_stdout
try:
yield None
finally:
sys.stdout = save_stdout
with open(filename, "w") as f:
with stdout_redirected(f):
print "Hello world"
Да, здесь нет «сахарку» из фри-бейсика, придется явно писать f.metod() и т.д.
Исходная версия Virtuos86, :
Шо, опять объяснять?
Википедия описывает RAII так.
Юзкейс для with как менеджера контекста иллюстрирует типовой пример:
f = open("file")
try:
# выполняем какие-то манипуляции с открытым файлом
…
finally:
# ветка `finally` гарантированно выполняется, и мы гарантированно закрываем файл
f.close()
context manager
.Вышеприведенный пример, будучи переписан, выглядит так:
with f = open("file"):
# выполняем какие-то манипуляции с открытым файлом
…
Понятное дело, под капотом всё та же кака с try/finally, но ее нужно писать только один раз — в самом менеджере контекста, а в остальном коде будет ляпота (осторожно, паста):
@contextmanager
def stdout_redirected(new_stdout):
save_stdout = sys.stdout
sys.stdout = new_stdout
try:
yield None
finally:
sys.stdout = save_stdout
with open(filename, "w") as f:
with stdout_redirected(f):
print "Hello world"
Да, здесь нет «сахарку» из фри-бейсика, придется явно писать f.metod() и т.д.