Spec-Zone.ru › Python 3.7

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 гарантированно не будет вызван при завершении интерпретатора, даже если он был зарегистрирован более чем один раз. unregister() безмолвно ничего не делает, если func ранее не был зарегистрирован.

См. также

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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/atexit.html

Spec-Zone.ru

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