Spec-Zone.ru › Python 3.11

atexit — Обработчики завершения

Модуль atexit определяет функции для регистрации и отмены регистрации обработчиков завершения. Функции, зарегистрированные таким образом, автоматически выполняются при нормальном завершении интерпретатора. atexit выполняет эти функции в обратном порядке их регистрации; если вы зарегистрируете A, B, и C, при завершении интерпретатора они будут выполнены в порядке C, B, A.

Примечание: Функции, зарегистрированные с помощью этого модуля, не вызываются, когда программа убивается сигналом, не обрабатываемым Python, когда обнаружена внутренняя ошибка Python или когда вызывается os._exit().

Примечание: Эффект регистрации или отмены регистрации функций внутри обработчика завершения не определён.

Изменено в версии 3.7: При использовании с подинтерпретаторами C-API зарегистрированные функции локальны для интерпретатора, в котором они были зарегистрированы.

atexit.register(func, *args, **kwargs)

Зарегистрировать func как функцию, которая должна быть выполнена при завершении. Любые необязательные аргументы, которые должны быть переданы в func, должны быть переданы в качестве аргументов register(). Можно регистрировать одну и ту же функцию и аргументы более одного раза.

При нормальном завершении программы (например, если вызвана sys.exit() или завершается выполнение основного модуля), все зарегистрированные функции вызываются в порядке LIFO (последним пришёл — первым вышел). Предполагается, что модули нижнего уровня обычно импортируются перед модулями более высокого уровня и, следовательно, должны быть очищены позже.

Если во время выполнения обработчиков завершения возникает исключение, выводится трассировка стека (если не вызвано SystemExit) и информация об исключении сохраняется. После того, как все обработчики завершения имели возможность выполниться, последнее возникшее исключение повторно поднимается.

Эта функция возвращает func, что позволяет использовать её как декоратор.

atexit.unregister(func)

Удалить func из списка функций, которые должны быть выполнены при завершении интерпретатора. unregister() молча ничего не делает, если func ранее не был зарегистрирован. Если func был зарегистрирован более одного раза, каждый экземпляр этой функции в стеке вызовов atexit будет удалён. Для сравнения на равенство (==) внутри при отмене регистрации используются встроенные функции сравнения, поэтому ссылки на функции не обязаны иметь одинаковые идентификаторы.

См. также

Module readline

Полезный пример использования atexit для чтения и записи файлов истории readline.

Пример использования atexit

Следующий простой пример демонстрирует, как модуль может инициализировать счётчик из файла при импорте и автоматически сохранять обновлённое значение счётчика при завершении программы, не полагаясь на явный вызов этого модуля при завершении.

try:
    with open('counterfile') as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open('counterfile', 'w') as outfile:
        outfile.write('%d' % _count)

import atexit

atexit.register(savecounter)

Позиционные и именованные аргументы также могут быть переданы в register() для передачи зарегистрированной функции при её вызове:

def goodbye(name, adjective):
    print('Goodbye %s, it was %s to meet you.' % (name, adjective))

import atexit

atexit.register(goodbye, 'Donny', 'nice')
# or:
atexit.register(goodbye, adjective='nice', name='Donny')

Использование в качестве декоратора:

import atexit

@atexit.register
def goodbye():
    print('You are now leaving the Python sector.')

Это работает только с функциями, которые можно вызвать без аргументов.

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/atexit.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API