atexit — Обработчики завершения
Модуль atexit определяет функции для регистрации и отмены регистрации функций очистки. Функции, зарегистрированные таким образом, автоматически выполняются при нормальном завершении интерпретатора. atexit выполняет эти функции в обратном порядке, в котором они были зарегистрированы; если вы регистрируете A, B, и C, при завершении интерпретатора они будут выполнены в порядке C, B, A.
Примечание: Функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается сигналом, не обрабатываемым Python, когда обнаружена внутренняя ошибка Python или когда вызывается os._exit().
-
atexit.register(func, *args, **kwargs) -
Регистрирует func как функцию, которая должна быть выполнена при завершении. Любые необязательные аргументы, которые нужно передать в func, должны быть переданы как аргументы в
register(). Можно регистрировать одну и ту же функцию и аргументы более одного раза.При нормальном завершении программы (например, если вызвана
sys.exit()или завершается выполнение основного модуля), все зарегистрированные функции вызываются в порядке «последний вошел, первый вышел». Предполагается, что модули нижнего уровня обычно импортируются перед модулями верхнего уровня, и поэтому их очистка должна выполняться позже.Если при выполнении обработчиков завершения возникает исключение, выводится трассировка стека (если не возникает
SystemExit), и информация об исключении сохраняется. После того как все обработчики завершения выполнились, последнее возникшее исключение повторно возникает.Эта функция возвращает func, что позволяет использовать её как декоратор.
-
atexit.unregister(func) -
Удаляет func из списка функций, которые должны быть выполнены при завершении интерпретатора. После вызова
unregister(), func гарантированно не будет вызвана при завершении интерпретатора, даже если она была зарегистрирована более одного раза.unregister()молча ничего не делает, если func ранее не была зарегистрирована.
См. также
29.8.1. Пример 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.6/library/atexit.html