Spec-Zone.ru › Python 3.9

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() или завершается выполнение основного модуля), все зарегистрированные функции вызываются в порядке «последний вошел, первый вышел». Предполагается, что модули более низкого уровня обычно импортируются до модулей более высокого уровня, и поэтому их необходимо очистить позже.

Если при выполнении обработчиков завершения возникает исключение, выводится трассировка стека (если не было поднято 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/atexit.html

Spec-Zone.ru

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