Source: Warnings

← Rendered

markdown source:

---
description: Вывод предупреждений в стандартной библиотеке python
tags: python-standart-library python
title: Warnings
---
Предупреждающие сообщения обычно выдаются в ситуациях, когда полезно предупредить пользователя о каком-либо состоянии в программе, где это условие (обычно) не требует возбуждения исключения и завершения программы. Модуль warnings является средством, позволяющим заблаговременно оповещать программистов об изменениях в языке и проблемах обратной совместимости. Кроме того он может использоваться для вывода сообщений о восстановимых ошибках конфигурации или изменения возможностей из-за отсутствия каких-то библиотек.

warnings подавляет вывод от одного и того же источника, чтобы не спамить сообщениями - это означает что один и тот же ворнинг может быть поднят множетсво раз в процессе выполнения, но будет выведен только однажды. Предупреждающие сообщения обычно записываются в sys.stderr, но их расположение можно гибко изменить, от игнорирования всех предупреждений до превращения их в исключения.

Управление предупреждениями состоит из двух этапов: во-первых, каждый раз, когда выдается предупреждение, определяется, следует ли выдавать сообщение или нет; затем, если сообщение должно быть выдано, оно форматируется и печатается с использованием настраиваемого пользователем хука. Решение о том, выдавать ли предупреждающее сообщение, контролируется фильтром предупреждений, который представляет собой последовательность соответствующих правил и действий. Правила можно добавить к фильтру, вызвав `filterwarnings()`, и сбросить его до состояния по умолчанию, вызвав `resetwarnings()`. Печать предупреждающих сообщений выполняется вызовом функции `showwarning()`, которую можно переопределить; реализация этой функции по умолчанию форматирует сообщение, вызывая `formatwarning()`, который также доступен для использования пользовательскими реализациями. `logging.captureWarnings()` позволяет обрабатывать все предупреждения с помощью стандартной инфраструктуры [[python-logging]].

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

- `Warning` базовый класс предупреждений, сабкласс `Exception`
- `UserWarning` дефолтная категория для `warn()`
- `DeprecationWarning` базовая категория для разработчиков приложений
- `SyntaxWarning`
- `RuntimeWarning`
- `FutureWarning` базовая категория для конечных пользователей приложений
- `PendingDeprecationWarning` предупреждение о возможном исключении в будущем
- `ImportWarning`
- `UnicodeWarning`
- `BytesWarning`
- `ResourceWarning`

[Подробнее тут](https://docs.python.org/3/library/warnings.html#warning-categories)

Фильтр предупреждений определяет, будут ли предупреждения игнорироваться, выводиться или создавать исключения. Филтр представляет собой кортеж вида (action, message, category, module, lineno), где:

- message - регулярное выражение для сопоставления с текстом предупреждения
- category - имя класса исключений
- module - регулярное выражение, сопоставимое с именем модуля, сгенерировашего предупреждение
- line number - обрабатывает специфические вхождения

Сгенерированное предупреждение сравнивается со всеми зарегистрирвоанными фильтрами. Первый совпавший фильтр регулирует действия в ответ на предупреждение. Если не один из фильтров не совпал, выполняется действие по умолчанию.

Возможные действия:

- error поднять исключение
- ignore игнорировать
- always всегда выводить
- default выводить, если предупреждение поднято впервые в данном контексте
- module выводить, если предупреждение поднято впервые в данном модуле
- once однократно

[Подробнее тут](https://docs.python.org/3/library/warnings.html#the-warnings-filter)

Простейший способ вызова:

```python
import warnings

warnings.warn('This is a warning message')
```

Вот так можно задать простейший фильтр (в данном случае поднять исклоючение):

```python
import warnings

warnings.simplefilter('error', UserWarning)
warnings.warn('This is a warning message')
```

Смотри также:

- [документация](https://docs.python.org/3/library/warnings.html)
- [[python-logging]]
- [[logging]]
- [[inspect]]
- [[python-standart-library]]


[python-logging]: ../lists/python-logging "Python logging"
[logging]: logging "Logging - основные принципы"
[inspect]: inspect "Inspect"
[python-standart-library]: ../lists/python-standart-library "Стандартная библиотека python и полезные ресурсы"