Объект Handler, обработчик модуля logging
Обратите внимание, что обработчики logging.Handler никогда не создается напрямую. Этот класс служит основой для более полезных подклассов.
В создаваемых подклассах метод конструктора __init__() должен вызывать Handler.__init__() .
Пакет logging предоставляет несколько полезных обработчиков, созданных на основе базового обработчика Handler :
- Основные обработчики StreamHandler , FileHandler ,
- WatchedFileHandler — отправляет данные журнала в файл, который реагирует на каждое изменение,
- RotatingFileHandler — отправляет данные журнала в файлы с ротацией, основываясь на их объеме,
- TimedRotatingFileHandler — отправляет данные журнала в файлы с ротацией, основываясь на отрезке времени,
- SMTPHandler — отправляет данные журнала на почту,
- HTTPHandler — отправляет данные журнала как POST и GET запросы,
Обьект Handler имеет следующие атрибуты и методы.
- Инициализирует экземпляр обработчика Handler.__init__() ,
- Инициализирует блокировку потока Handler.createLock() ,
- Получает блокировку потока Handler.acquire() ,
- Снимает блокировку потока Handler.release() ,
- Устанавливает порог логирования Handler.setLevel() ,
- Устанавливает Formatter Handler.setFormatter() ,
- Добавляет указанный фильтр Handler.addFilter() ,
- Удаляет указанный фильтр Handler.removeFilter() ,
- Применяет добавленные фильтр Handler.filter() ,
- Сбрасывает журнал Handler.flush() ,
- Освобождает ресурсы, используемые обработчиком Handler.close() ,
- Выдает указанную запись Handler.handle() ,
- Подавляет ошибки обработчика Handler.handleError() ,
- Форматирует запись Handler.format() ,
- Регистрирует запись в журнале Handler.emit() .
Handler.__init__(level=NOTSET) :
Метод Handler.__init__() инициализирует экземпляр обработчика Handler , устанавливая его level , устанавливает список фильтров в пустой список [] и создает блокировку, используя Handler.createLock() , для сериализации доступа к механизму ввода-вывода.
Handler.createLock() :
Метод Handler.createLock() инициализирует блокировку потока, которая может использоваться для сериализации доступа к базовым функциям ввода-вывода, которые могут быть не безопасными для потоков.
Handler.acquire() :
Метод Handler.acquire() получает блокировку потока, созданную с помощью Handler.createLock() .
Handler.release() :
Метод Handler.release() снимает блокировку потока, полученную с Handler.acquire() .
Handler.setLevel(level) :
Метод Handler.setLevel() устанавливает порог логирования level для этого обработчика.
Сообщения, которые менее серьезны, чем уровень level , будут игнорироваться. Когда создается обработчик, устанавливается уровень NOTSET , что приводит к обработке всех сообщений.
Handler.setFormatter(fmt) :
Метод Handler.setFormatter() устанавливает logging.Formatter для этого обработчика в значение fmt .
Handler.addFilter(filter) :
Метод Handler.addFilter() добавляет указанный фильтр filter к этому обработчику Handler .
Handler.removeFilter(filter) :
Метод Handler.removeFilter() удаляет указанный фильтр filter из этого обработчика Handler .
Handler.filter(record) :
Метод Handler.filter() применяет фильтры этого обработчика к записи record и возвращает True , если она должна быть обработана.
Фильтры применяются по очереди, пока один из них не возвращает ложное значение. Если ни один не возвращает ложное значение, то запись будет обработана, т.е. передана обработчикам. Если возвращается ложное значение, дальнейшая обработка записи не происходит.
Handler.flush() :
Метод Handler.flush() сбрасывает все выходные данные журнала. Эта версия ничего не делает и предназначена для реализации подклассами.
Handler.close() :
Метод Handler.close() освобождает любые ресурсы, используемые обработчиком. Эта версия удаляет обработчик из внутреннего списка обработчиков, который закрывается при logging.shutdown() . Подклассы должны гарантировать, что этот метод вызывается из переопределенного метода close() .
Handler.handle(record) :
Метод Handler.handle() условно выдает указанную запись record журнала в зависимости от фильтров, которые могли быть добавлены в обработчик. Обертывает фактическую эмиссию записи с получением/снятием блокировки потока ввода/вывода.
Handler.handleError(record) :
Метод Handler.handleError() должен вызываться из обработчиков, когда во время вызова метода Handler.emit() встречается исключение. Если атрибут levelExceptions уровня модуля равен False , то исключения автоматически игнорируются.
Это то, что в основном требуется для системы ведения журнала — большинство пользователей не заботятся об ошибках в системе ведения журнала, их больше интересуют ошибки приложения. Однако его можно заменить на собственный обработчик, если конечно необходимо.
Указанная запись record является той, которая обрабатывалась при возникновении исключения. Значением по умолчанию для параметра levelExceptions является True , поскольку это более полезно при разработке.
Handler.format(record) :
Метод Handler.format() делает форматирование для записи. Если установлен logging.Formatter() , то используйте его. В противном случае использует форматирование, установленное по умолчанию для модуля.
Handler.emit(record) :
Метод Handler.emit() делает все возможное, чтобы фактически зарегистрировать указанную запись в журнале. Эта версия предназначена для реализации подклассами и поэтому вызывает ошибку NotImplementedError .
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Простое использование модуля logging
- Продвинутое использование модуля logging
- Принцип работы пакета logging
- Функция getLogger() модуля logging
- Функции регистрации сообщений модуля logging
- Функция exception() модуля logging
- Функция log() модуля logging
- Функция disable() модуля logging
- Функция addLevelName() модуля logging
- Функция getLevelName() модуля logging
- Функция basicConfig() модуля logging
- Функция captureWarnings() модуля logging
- Функция shutdown() модуля logging
- Объект LogRecord() модуля logging
- Объект Logger модуля logging
- Объект Handler модуля logging
- Класс Formatter() модуля logging
- Класс Filter() модуля logging
- Класс LoggerAdapter() модуля logging
- Функция dictConfig() модуля logging.config
- Функция fileConfig() модуля logging.config
- StreamHandler и FileHandler обработчики модуля logging
- Класс WatchedFileHandler() модуля logging.handlers
- Класс RotatingFileHandler() модуля logging.handlers
- Класс TimedRotatingFileHandler() модуля logging
- Класс SMTPHandler() модуля logging.handlers
- Класс HTTPHandler() модуля logging.handlers
Python handler примеры использования
Python handler — 6 примеров найдено. Это лучшие примеры Python кода для eventlib.handler, полученные из open source проектов. Вы можете ставить оценку каждому примеру, чтобы помочь нам улучшить качество примеров.
Related in langs
def test_process_raises_the_exception_when_debugging(settings, find_event): core.cleanup_handlers() settings.DEBUG = True handler_fail = Mock() handler_fail.side_effect = ValueError('P0wned. ') eventlib.handler('myapp.CoolEvent')(handler_fail) name, data = 'myapp.CoolEvent', ejson.dumps() core.process.when.called_with(name, data).should.throw(ValueError, 'P0wned. ')
def test_process_raises_the_exception_when_debugging(settings, find_event): core.cleanup_handlers() settings.DEBUG = True handler_fail = Mock() handler_fail.side_effect = ValueError('P0wned. ') eventlib.handler('myapp.CoolEvent')(handler_fail) name, data = 'myapp.CoolEvent', ejson.dumps() core.process.when.called_with(name, data).should.throw( ValueError, 'P0wned. ')
def test_process(find_event): core.cleanup_handlers() handler = Mock() eventlib.handler('app.Event')(handler) handler2 = Mock() eventlib.handler('app.Event')(handler2) data = core.process('app.Event', ejson.dumps(data)) handler.assert_called_once_with(data) handler2.assert_called_once_with(data)
def test_process(find_event): core.cleanup_handlers() handler = Mock() eventlib.handler('app.Event')(handler) handler2 = Mock() eventlib.handler('app.Event')(handler2) data = core.process('app.Event', ejson.dumps(data)) handler.assert_called_once_with(data) handler2.assert_called_once_with(data)
def test_process_fails_gracefully(settings, logger, find_event): core.cleanup_handlers() settings.DEBUG = False handler_fail = Mock() handler_fail.side_effect = ValueError('P0wned. ') eventlib.handler('myapp.CoolEvent')(handler_fail) handler = Mock() eventlib.handler('myapp.CoolEvent')(handler) data = event = 'myapp.CoolEvent' core.process(event, ejson.dumps(data)) logger.warning.assert_called_once_with( 'One of the handlers for the event "myapp.CoolEvent" has ' 'failed with the following exception: P0wned. ') handler.assert_called_once_with(data)
Handler
Хендлеры это конечная точка в обработке событий. Хендлеры могут быть блокирующими (если нашелся подходящий хендлер другие уже не проверяются и не выполняются) и не блокирующими (в таком случае количество выполняемых хендлеров не ограничено и зависит от того какие пройдут). По умолчанию все хендлеры являются блокирующими
Хендлеры помечаются (лейблируются) с помощью декораторов. За это отвечает Labeler high-level инстанс с которым вы работаете. Пример с ботом:
1 2 3 4 5 6 7 8 9
from vkbottle.bot import Bot, Message bot = Bot("token") @bot.on.message() async def any_message(message: Message): await message.answer("Привет я бот") bot.run_forever()
Хендлеры ботов
message
Этот хендлер показан в примере выше
Хендлер на все сообщения (и из чата, и из личных сообщений)
chat_message
Хендлер на сообщения из чатов
private_message
Хендлер на сообщения из личных диалогов
Типы хендлеров выше не делают ничего необычного, просто оперируют предустановленным правилом PeerRule :
- в message он не предустанавливается
- в chat_message — PeerRule(True)
- в private_message — PeerRule(False)
В качестве аргументов декоратор принимает инстансы правил ( ABCRule ), а в качестве kwargs он принимает значение из custom_rules (подробнее в туториале
Если правило вернуло словарь, то он будет распакован и передан в качестве аргументов в хендлер, если он принимает их:
1 2 3 4 5 6 7 8 9 10 11 12 13
# Кастомное правило MyRule возвращает словарь `` @bot.on.message(MyRule()) async def some_key_handler(message: Message, some_key: str): await message.answer(f"some_key=some_value>") @bot.on.message(MyRule()) async def regular_handler(message: Message): await message.answer("Этот хендлер не принимает аргумент 'some_key', поэтому он и не был передан") @bot.on.message(MyRule()) async def kwargs_handler(message: Message, **kwargs): await message.answer(f"В хендлере переданы аргументы: kwargs>") # В хендлере переданы аргументы:
Что такое handler в python?
Что такое handler в python? Вот обычный код начинается писать с букв а именно handler со символа ‘@’, почему?
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 19 апр 2021 в 16:33
nellvincent nellvincent
148 2 2 серебряных знака 14 14 бронзовых знаков
Это декоратор. Вот статейка: tproger.ru/translations/demystifying-decorators-in-python
19 апр 2021 в 16:35
handler — это просто такое английское слово. Никакой такой особой конструкции в питоне нет. А с собачки в питоне обычно начинается использование вышеупомянутых декораторов, которые можно использовать много для чего, не только для handler’ов
19 апр 2021 в 16:39
Окей, спасибо:)
19 апр 2021 в 17:00
Под handler обычно подразумевается обработчик чего-то (каких-то событий, входящих соединений, сообщений и т.д.) Это не специфическое конкретно для Python понятие. Скорее всего в коде, где вы это увидели, через декоратор делают функцию обработчиком чего-то.
19 апр 2021 в 17:16
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В Python @ это особый знак который обозначает обернуть функции в другую или же по другому — использовать декоратор.
Теория
Ево можно использовать почти везде как дополнение, а handler это название функции которой обвернуть вашу функцию.
На самом деле лучший пример использования декораторов в создание телеграм ботов, они там на каждом носу.
Вы с помощью декораторов можете добавлять фишки разные например сделать так чтобы ваш декоратор измерял время исполнения функции или изменял аргументы
Практика
Щас покажу на самом простом деле
def clocker(func): def clock(*args): import time start_time = time.time() func(*args) print(f"[]") return clock @clocker def main(): for i in range(0,1000): print(i) main()
Разберём этот код — первое что мы делаем это создаём свою функцию декоратор которая тоже имеет функцию, пайтон воспринимает так дать фукнции clocker саму функции и всё про ее, а функции clock ее аргументы. Наш код идёт так, сначала идёт функция clocker , потом clock она уже запускает нашу функцию и в конце показывает имя функции с временем на выполнения