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

atexit.md

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

1> **Источник:** https://python-all.ru/3.10/library/atexit.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) – Обработчики завершения89---1011Модуль [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора. [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) выполняет эти функции в *обратном* порядке их регистрации; если зарегистрировать `A`, `B` и `C`, то при завершении интерпретатора они будут выполнены в порядке `C`, `B`, `A`.1213**Примечание:** Функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается по сигналу, не обрабатываемому Python, когда обнаружена фатальная внутренняя ошибка Python или при вызове [`os._exit()`](https://python-all.ru/3.10/library/os.html#os._exit).1415Изменено в версии 3.7: При использовании с C-API подынтерпретаторами зарегистрированные функции являются локальными для того интерпретатора, в котором они были зарегистрированы.1617#### `atexit.register(func, *args, **kwargs)`1819Регистрирует *func* как функцию, которая будет выполнена при завершении. Все необязательные аргументы, которые должны быть переданы *func*, должны быть переданы как аргументы в [`register()`](https://python-all.ru/3.10/library/atexit.html#atexit.register). Можно зарегистрировать одну и ту же функцию и аргументы несколько раз.2021При нормальном завершении программы (например, если вызывается [`sys.exit()`](https://python-all.ru/3.10/library/sys.html#sys.exit) или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке последним вошёл – первым вышел. Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны быть очищены позже.2223Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка (если только не возникло [`SystemExit`](https://python-all.ru/3.10/library/exceptions.html#SystemExit)) и информация об исключении сохраняется. После того как все обработчики завершения отработают, последнее возникшее исключение возбуждается снова.2425Эта функция возвращает *func*, что позволяет использовать её как декоратор.2627#### `atexit.unregister(func)`2829Удаляет *func* из списка функций, которые должны быть выполнены при завершении интерпретатора. [`unregister()`](https://python-all.ru/3.10/library/atexit.html#atexit.unregister) ничего не делает, если *func* не была зарегистрирована ранее. Если *func* была зарегистрирована несколько раз, каждое вхождение этой функции в стек вызовов [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) будет удалено. Сравнения на равенство (`==`) используются внутри процедуры отмены регистрации, поэтому ссылки на функцию не должны быть одинаковыми.3031> **См. также**32>33> **Модуль [`readline`](https://python-all.ru/3.10/library/readline.html#module-readline)**34>35> Полезный пример использования [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) для чтения и записи [`readline`](https://python-all.ru/3.10/library/readline.html#module-readline) файлов истории.3637## [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) Пример3839Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.4041```python42try:43    with open('counterfile') as infile:44        _count = int(infile.read())45except FileNotFoundError:46    _count = 04748def incrcounter(n):49    global _count50    _count = _count + n5152def savecounter():53    with open('counterfile', 'w') as outfile:54        outfile.write('%d' % _count)5556import atexit5758atexit.register(savecounter)59```6061Позиционные и именованные аргументы также могут быть переданы в [`register()`](https://python-all.ru/3.10/library/atexit.html#atexit.register), чтобы быть переданными зарегистрированной функции при её вызове:6263```python64def goodbye(name, adjective):65    print('Goodbye %s, it was %s to meet you.' % (name, adjective))6667import atexit6869atexit.register(goodbye, 'Donny', 'nice')70# или:71atexit.register(goodbye, adjective='nice', name='Donny')72```7374Использование в качестве [декоратора](https://python-all.ru/3.10/glossary.html#term-decorator):7576```python77import atexit7879@atexit.register80def goodbye():81    print('You are now leaving the Python sector.')82```8384Это работает только с функциями, которые можно вызывать без аргументов.85