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

atexit.md

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

1> **Источник:** https://python-all.ru/3.5/library/atexit.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 29.8. [`atexit`](https://python-all.ru/3.5/library/atexit.html#module-atexit) – Обработчики выхода89---1011Модуль [`atexit`](https://python-all.ru/3.5/library/atexit.html#module-atexit) определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора. [`atexit`](https://python-all.ru/3.5/library/atexit.html#module-atexit) выполняет эти функции в *обратном* порядке их регистрации; если зарегистрировать `A`, `B` и `C`, то при завершении интерпретатора они будут выполнены в порядке `C`, `B`, `A`.1213**Примечание:** Функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается по сигналу, не обрабатываемому Python, когда обнаружена фатальная внутренняя ошибка Python или при вызове [`os._exit()`](https://python-all.ru/3.5/library/os.html#os._exit).1415#### `atexit.register(func, *args, **kargs)`1617Регистрирует *func* как функцию, которая будет выполнена при завершении. Все необязательные аргументы, которые должны быть переданы *func*, должны быть переданы как аргументы в [`register()`](https://python-all.ru/3.5/library/atexit.html#atexit.register). Можно зарегистрировать одну и ту же функцию и аргументы несколько раз.1819При нормальном завершении программы (например, если вызывается [`sys.exit()`](https://python-all.ru/3.5/library/sys.html#sys.exit) или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке последним вошёл – первым вышел. Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны быть очищены позже.2021Если во время выполнения обработчиков выхода возникает исключение, выводится traceback (если только не возбуждено [`SystemExit`](https://python-all.ru/3.5/library/exceptions.html#SystemExit)) и сохраняется информация об исключении. После того как все обработчики выхода получили возможность выполниться, последнее возбуждённое исключение возбуждается повторно.2223Эта функция возвращает *func*, что позволяет использовать её как декоратор.2425#### `atexit.unregister(func)`2627Удаляет *func* из списка функций, выполняемых при завершении интерпретатора. После вызова [`unregister()`](https://python-all.ru/3.5/library/atexit.html#atexit.unregister) гарантируется, что *func* не будет вызван при завершении интерпретатора, даже если он был зарегистрирован более одного раза. [`unregister()`](https://python-all.ru/3.5/library/atexit.html#atexit.unregister) молча ничего не делает, если *func* не был ранее зарегистрирован.2829> **См. также**30>31> **Модуль [`readline`](https://python-all.ru/3.5/library/readline.html#module-readline)**32>33> Полезный пример использования34>35> [`atexit`](https://python-all.ru/3.5/library/atexit.html#module-atexit)36>37> для чтения и записи38>39> [`readline`](https://python-all.ru/3.5/library/readline.html#module-readline)40>41> файлов истории.4243## 29.8.1. [`atexit`](https://python-all.ru/3.5/library/atexit.html#module-atexit) Пример4445Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.4647```python48try:49    with open("counterfile") as infile:50        _count = int(infile.read())51except FileNotFoundError:52    _count = 05354def incrcounter(n):55    global _count56    _count = _count + n5758def savecounter():59    with open("counterfile", "w") as outfile:60        outfile.write("%d" % _count)6162import atexit63atexit.register(savecounter)64```6566Позиционные и именованные аргументы также могут быть переданы в [`register()`](https://python-all.ru/3.5/library/atexit.html#atexit.register), чтобы быть переданными зарегистрированной функции при её вызове:6768```python69def goodbye(name, adjective):70    print('Goodbye, %s, it was %s to meet you.' % (name, adjective))7172import atexit73atexit.register(goodbye, 'Donny', 'nice')7475# или:76atexit.register(goodbye, adjective='nice', name='Donny')77```7879Использование в качестве [декоратора](https://python-all.ru/3.5/glossary.html#term-decorator):8081```python82import atexit8384@atexit.register85def goodbye():86    print("You are now leaving the Python sector.")87```8889Это работает только с функциями, которые можно вызывать без аргументов.90