Pythonic, настраиваемые предупреждения

Основной вопрос:Каков наиболее логичный/питоновский способ создания собственных классов предупреждений? Каковы правильные классы предупреждений и исключений, которые я должен создавать подклассами?

Мотивация:В требованиях к библиотеке, которую я пишу, указывается, что если 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)при обнаружении попытки вставки повторяющегося элемента.

Конкретные вопросы:

  1. Должен ли я создавать подклассы UserWarning, как указано выше, или просто подклассы Warning?

  2. Представляется семантически разумным создание подкласса ValueError(, который в приведенном выше примере просто вставляет ValueErrorв MRO между WarningиException)на случай, если вызывающая сторона хочет рассматривать предупреждения как ошибки. Есть ли в этом недостаток, которого я не вижу?

  3. Я не смог найти на StackOverflow предыдущих вопросов о настройке классов предупреждений. Это потому, что программистам Python даже не нравится использовать модуль warnings?

10
задан wkschwartz 25 April 2012 в 18:51
поделиться