Веб-версияОткрыть в Telegram

ПостВ Golang 👣 есть такая инструкция defer, которая планирует отложенное действие при выходе из текущей функции. Часто этим …

27 ноября 2022
П
Питонические атаки
Ссылка
нажмите — покажем
В Golang 👣 есть такая инструкция defer, которая планирует отложенное действие при выходе из текущей функции. Часто этим пользуются как контекстным менеджером, типа, открываешь файл и тут же при помощи defer планируешь его закрытие: f := createFile("/tmp/defer.txt") defer closeFile(f) Причём закрытие файла выполнится даже если где-то дальше в этой функции произойдёт ошибка — это предотвращает утечку ресурсов. Ещё при помощи defer можно, собственно, перехватывать и обрабатывать разные ошибки. Короче, да, примерно как контекстные менеджеры или блоки try-finally, но не создают дополнительный уровень вложенности в коде, а ещё открытие и закрытие ресурса обычно находятся в коде рядом друг с другом, а не на разных концах файла. Можно выполнить несколько defer — они складываются в стэк, а при завершении функции по очереди снимаются со стэка и выполняются (получается, в обратном порядке). К чему я это. Чувак с реддита сделал аналог такой инструкции для питона. Работает следующим образом: @defers def f(): print(1) defer: print(3) print(2) Вызов f() напечатает 1 2 3. Почти как на Go, только с декоратором над функцией и лишним двоеточием после defer. Под капотом там происходит разбор и модификация AST тела функции, задекорированной @defers. Обратите внимание на строчку defer: print(3). Синтаксически здесь происходит аннотация переменной defer, а в тайп-хинте лежит какой-то вызов функции. Python игнорирует тайп-хинты для переменных в теле функций, то есть функцию вызывать он не будет даже пытаться — можно положить туда что угодно, лишь бы соответствовало синтаксису. Библиотека выполняет код из тайп-хинта на выходе из функции. Интересная эксплуатация особенностей языка! Автор не рекомендует пользоваться этим в продакшене. Это скорее забавная поделка, чем рабочий инструмент. Но если всё-таки будете, то обязательно применять в комплекте с: result, err = do_thing() if err is not None: return None, err Иначе не прочувствуете вайб! 🖥 GitHub | Тред на реддите
22 · 1K ·

Рядом в ленте

ППитонические атакиI often find myself writing a context manager to temporarily change the current working directory: import os from contexlib import contextmanager @contextmanageППитонические атакиБольшое интервью Гвидо ван Россума час назад вышло у Лекса Фридмана https://www.youtube.com/watch?v=-DVyjdw4t9I 0:00 - Introduction 0:48 - CPython 6:01 - Code r
это сообщение
ППитонические атакиЯ всё чаще и чаще замечаю Rust рядом с Python... Совершенно недавно я нашел вот такой HTTP сервер на Rust для приложений на Python - Granian. Разработчики ставяППитонические атакиThe typing.assert_type function (added in Python 3.11) does nothing in runtime as most of the stuff from the typing module. However, if the type of the first ar
ППитонические атакиПитонические атаки@pythonic_attacks · канал · Технологии
1 148подписчиков629постов в индексе
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Границы индекса · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем