atexit.md
1> **Источник:** https://python-all.ru/2.6/library/atexit.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.8. `atexit` – Обработчики завершения89Новое в версии 2.0.1011Модуль `atexit` определяет единственную функцию для регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора.1213Примечание: функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается по сигналу, когда обнаружена фатальная внутренняя ошибка Python или когда [`os._exit()`](https://python-all.ru/2.6/library/os.html#os._exit) вызывается.1415Это альтернативный интерфейс к функциональности, предоставляемой переменной `sys.exitfunc`.1617Примечание: Этот модуль вряд ли будет работать корректно при использовании с другим кодом, который устанавливает `sys.exitfunc`. В частности, другие основные модули Python могут свободно использовать `atexit` без ведома программиста. Авторам, использующим `sys.exitfunc`, следует преобразовать свой код для использования `atexit`. Самый простой способ преобразовать код, устанавливающий `sys.exitfunc`, – это импортировать `atexit` и зарегистрировать функцию, которая была привязана к `sys.exitfunc`.1819#### `atexit.register(func[, *args[, **kargs]])`2021Регистрирует функцию *func* для выполнения при завершении. Любые необязательные аргументы, которые нужно передать *func*, должны быть переданы как аргументы [`register()`](https://python-all.ru/2.6/library/atexit.html#atexit.register).2223При нормальном завершении программы (например, если вызывается [`sys.exit()`](https://python-all.ru/2.6/library/sys.html#sys.exit) или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке «последним пришёл – первым обслужен». Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны очищаться позже.2425Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка (если только не было возбуждено [`SystemExit`](https://python-all.ru/2.6/library/exceptions.html#exceptions.SystemExit)), а информация об исключении сохраняется. После того как все обработчики завершения отработают, последнее возникшее исключение возбуждается повторно.2627Изменено в версии 2.6: Теперь эта функция возвращает *func*, что позволяет использовать её в качестве decorator без привязки исходного имени к `None`.2829> **См. также**30>31> **Модуль [`readline`](https://python-all.ru/2.6/library/readline.html#module-readline)**32>33> Полезный пример использования34>35> `atexit`36>37> для чтения и записи38>39> [`readline`](https://python-all.ru/2.6/library/readline.html#module-readline)40>41> файлов истории.4243## 27.8.1. `atexit` Пример4445Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.4647```python48try:49 _count = int(open("/tmp/counter").read())50except IOError:51 _count = 05253def incrcounter(n):54 global _count55 _count = _count + n5657def savecounter():58 open("/tmp/counter", "w").write("%d" % _count)5960import atexit61atexit.register(savecounter)62```6364Позиционные и именованные аргументы также могут быть переданы в [`register()`](https://python-all.ru/2.6/library/atexit.html#atexit.register) для последующей передачи зарегистрированной функции при её вызове:6566```python67def goodbye(name, adjective):68 print 'Goodbye, %s, it was %s to meet you.' % (name, adjective)6970import atexit71atexit.register(goodbye, 'Donny', 'nice')7273# или:74atexit.register(goodbye, adjective='nice', name='Donny')75```7677Использование в качестве [*декоратора*](https://python-all.ru/2.6/glossary.html#term-decorator):7879```python80import atexit8182@atexit.register83def goodbye():84 print "You are now leaving the Python sector."85```8687Это, очевидно, работает только с функциями, которые не принимают аргументов.88