Основной вопрос:Каков наиболее логичный/питоновский способ создания собственных классов предупреждений? Каковы правильные классы предупреждений и исключений, которые я должен создавать подклассами?
Мотивация:В требованиях к библиотеке, которую я пишу, указывается, что если MyContainer
объект c
содержит элемент x
и вызывающая сторона библиотеки пытается поместить «дубликат»x
--вызовите егоy
--в c
, вызывающему выдается предупреждение, и возвращаемое значение c.my_transformation_method(x, y)
помещается в c
для замены x
. Другими словами, MyContainer
заменит элементы их дубликатами, но при этом должен предупредить пользователя.
Насколько я читал, самый гибкий способ предупредить вызывающую библиотеку о нефатальном действии — использовать стандартный модуль warnings . Это позволяет вызывающей стороне обрабатывать предупреждение по своему усмотрению.делать что угодно, от игнорирования предупреждений до обработки их как ошибок. (Обратите внимание, что я использую Python 3, но я не думаю, что это существенно для данного вопроса.)
Пример:Я определил следующий подкласс предупреждения:
class DuplicateItemWarning(UserWarning, ValueError):
pass
Затем метод add()
класса MyContainer
вызывает warnings.warn('detected duplicate', DuplicateItemWarning)
при обнаружении попытки вставки повторяющегося элемента.
Конкретные вопросы:
Должен ли я создавать подклассы UserWarning
, как указано выше, или просто подклассы Warning
?
Представляется семантически разумным создание подкласса ValueError
(, который в приведенном выше примере просто вставляет ValueError
в MRO между Warning
иException
)на случай, если вызывающая сторона хочет рассматривать предупреждения как ошибки. Есть ли в этом недостаток, которого я не вижу?
Я не смог найти на StackOverflow предыдущих вопросов о настройке классов предупреждений. Это потому, что программистам Python даже не нравится использовать модуль warnings
?