Документация Python неофициальный перевод

atexit.md

98 строк · 5.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/atexit.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.7. `atexit` – Обработчики выхода89Модуль `atexit` определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора.1011Примечание: функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается по сигналу, не обрабатываемому Python, когда обнаружена фатальная внутренняя ошибка Python, или когда вызывается [`os._exit()`](https://python-all.ru/3.1/library/os.html#os._exit).1213#### `atexit.register(func, *args, **kargs)`1415Регистрирует функцию *func* для выполнения при завершении. Любые необязательные аргументы, которые нужно передать *func*, должны быть переданы как аргументы [`register()`](https://python-all.ru/3.1/library/atexit.html#atexit.register).1617При нормальном завершении программы (например, если вызывается [`sys.exit()`](https://python-all.ru/3.1/library/sys.html#sys.exit) или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке «последним пришёл – первым обслужен». Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны очищаться позже.1819Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка (если только не было возбуждено [`SystemExit`](https://python-all.ru/3.1/library/exceptions.html#SystemExit)), а информация об исключении сохраняется. После того как все обработчики завершения отработают, последнее возникшее исключение возбуждается повторно.2021Эта функция возвращает *func*, что позволяет использовать её в качестве декоратора без привязки исходного имени к `None`.2223#### `atexit.unregister(func)`2425Удаляет функцию2627*func*2829из списка функций для выполнения при завершении работы интерпретатора. После вызова3031[`unregister()`](https://python-all.ru/3.1/library/atexit.html#atexit.unregister)3233гарантируется, что3435*func*3637не будет вызвана при остановке интерпретатора.3839> **См. также**40>41> **Модуль [`readline`](https://python-all.ru/3.1/library/readline.html#module-readline)**42>43> Полезный пример использования44>45> `atexit`46>47> для чтения и записи файлов истории48>49> [`readline`](https://python-all.ru/3.1/library/readline.html#module-readline)50>51> .5253## 27.7.1. Пример `atexit`5455Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.5657```python58try:59    _count = int(open("/tmp/counter").read())60except IOError:61    _count = 06263def incrcounter(n):64    global _count65    _count = _count + n6667def savecounter():68    open("/tmp/counter", "w").write("%d" % _count)6970import atexit71atexit.register(savecounter)72```7374Позиционные и именованные аргументы также могут быть переданы в [`register()`](https://python-all.ru/3.1/library/atexit.html#atexit.register) для последующей передачи зарегистрированной функции при её вызове:7576```python77def goodbye(name, adjective):78    print('Goodbye, %s, it was %s to meet you.' % (name, adjective))7980import atexit81atexit.register(goodbye, 'Donny', 'nice')8283# или:84atexit.register(goodbye, adjective='nice', name='Donny')85```8687Использование в качестве [*декоратора*](https://python-all.ru/3.1/glossary.html#term-decorator):8889```python90import atexit9192@atexit.register93def goodbye():94    print("You are now leaving the Python sector.")95```9697Это, очевидно, работает только с функциями, которые не принимают аргументов.98