TGViewer
Питонические атаки Питонические атаки @pythonic_attacks · 1.15K subscribers
Post #528 1.03K
В 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 | Тред на реддите
GitHub GitHub - dankeyy/defer.py: troll go users for fun and profit troll go users for fun and profit. Contribute to dankeyy/defer.py development by creating an account on GitHub.
  • 🤡 20
  • 😁 10
  • 👍 7
  • 🔥 3
  • ❤ 2
  • 👎 1
  • 🥴 1
More from @pythonic_attacks
  1. May 24, 2026GPT-5.5 по дефолту предпочитает использовать uv. Совпадение? Абсолютно точно нет. Логично…
  2. Mar 19, 2026Новость вызывает столько противоречивых мыслей, что я даже прерву радио молчание. С одной…
  3. Mar 19, 2026https://openai.com/index/openai-to-acquire-astral/ & https://astral.sh/blog/openai Это не…
  4. Nov 17, 2025Ну что же.. Мы совместно с Эммой Смит опубликовали Pre-PEP о добавлении Раста в CPython. В…
  5. May 19, 2025Вышел трейлер документалки о Python. Что-то на уровне Marvel, возможно даже выше https://w…
  6. May 15, 2025All good things come to an end Что ж, скажем Майкрософту спасибо, что 4 года содержал кома…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →