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

atexit.md

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

1> **Источник:** https://python-all.ru/3.4/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.4/library/atexit.html#module-atexit) – обработчики завершения89Модуль [`atexit`](https://python-all.ru/3.4/library/atexit.html#module-atexit) определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются при нормальном завершении интерпретатора. [`atexit`](https://python-all.ru/3.4/library/atexit.html#module-atexit) запускает эти функции в *обратном* порядке относительно того, в котором они были зарегистрированы; если зарегистрировать `A`, `B` и `C`, то при завершении интерпретатора они будут выполнены в порядке `C`, `B`, `A`.1011**Примечание:** Функции, зарегистрированные через этот модуль, не вызываются, когда программа уничтожается сигналом, не обрабатываемым Python, когда обнаружена фатальная внутренняя ошибка Python, или когда вызывается [`os._exit()`](https://python-all.ru/3.4/library/os.html#os._exit).1213#### `atexit.register(func, *args, **kargs)`1415Регистрирует *func* как функцию, которая будет выполнена при завершении. Любые необязательные аргументы, которые должны быть переданы *func*, необходимо передать в качестве аргументов в [`register()`](https://python-all.ru/3.4/library/atexit.html#atexit.register). Можно зарегистрировать одну и ту же функцию и аргументы несколько раз.1617При нормальном завершении программы (например, если вызывается [`sys.exit()`](https://python-all.ru/3.4/library/sys.html#sys.exit) или завершается выполнение главного модуля) все зарегистрированные функции вызываются в порядке «последним пришёл – первым обслужен». Предполагается, что модули нижнего уровня обычно импортируются раньше модулей верхнего уровня и, следовательно, должны очищаться позже.1819Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка (если только не было возбуждено [`SystemExit`](https://python-all.ru/3.4/library/exceptions.html#SystemExit)), а информация об исключении сохраняется. После того как все обработчики завершения отработают, последнее возникшее исключение возбуждается повторно.2021Эта функция возвращает *func*, что позволяет использовать её как декоратор.2223#### `atexit.unregister(func)`2425Удаляет *func* из списка функций, выполняемых при завершении интерпретатора. После вызова [`unregister()`](https://python-all.ru/3.4/library/atexit.html#atexit.unregister) гарантируется, что *func* не будет вызвана при завершении интерпретатора, даже если она была зарегистрирована несколько раз. [`unregister()`](https://python-all.ru/3.4/library/atexit.html#atexit.unregister) безмолвно ничего не делает, если *func* не была зарегистрирована ранее.2627> **См. также**28>29> **Модуль [`readline`](https://python-all.ru/3.4/library/readline.html#module-readline)**30>31> Полезный пример использования32>33> [`atexit`](https://python-all.ru/3.4/library/atexit.html#module-atexit)34>35> для чтения и записи файлов истории36>37> [`readline`](https://python-all.ru/3.4/library/readline.html#module-readline)38>39> .4041## 29.8.1. [`atexit`](https://python-all.ru/3.4/library/atexit.html#module-atexit) Пример4243Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля приложением при завершении.4445```python46try:47    with open("counterfile") as infile:48        _count = int(infile.read())49except FileNotFoundError:50    _count = 05152def incrcounter(n):53    global _count54    _count = _count + n5556def savecounter():57    with open("counterfile", "w") as outfile:58        outfile.write("%d" % _count)5960import atexit61atexit.register(savecounter)62```6364Позиционные и именованные аргументы также могут быть переданы в [`register()`](https://python-all.ru/3.4/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/3.4/glossary.html#term-decorator):7879```python80import atexit8182@atexit.register83def goodbye():84    print("You are now leaving the Python sector.")85```8687Это работает только с функциями, которые можно вызывать без аргументов.88