2015-01-23 4 views
0

Я создаю приложение с философией «непременно (если не обязательно)». Нефатальные ошибки будут собраны и представлены конечным пользователям в качестве предупреждений в отчете. Класс подклассов Предупреждения кажется хорошей идея, но есть один очень странное препятствие: я могу только выдавать предупреждения с помощью следующей библиотеки метода:Предупреждение о подклассе

warnings.warn(message, category=None, stacklevel=1)` 

Так скажем, одно из предупреждений мне нужно войти в около 99 орфографические ошибки в текстовом документе, вместе с номером строки, где произошли каждая опечатка:

class UserCannotSpell(UserWarning): 
    def __init__(self, misspelled_document): 
     super().__init__() 
     self.document = misspelled_document 
     self.misspellings = [] 

    def add(self, misspelling): 
     self.misspellings.append(misspelling) 

... документ был обработан и UserCannotSpell() объект готов. Единственная проблема: я не могу raise и не могу warnings.warn(). Какие-либо предложения?

+0

Когда я использую свой класс, я могу действительно использовать 'warnings.warn' на примере его , Предупреждение отсутствует «содержание», но это потому, что вы не определяете '__str__'. Что происходит, когда вы пытаетесь использовать «предупреждения, предупреждения» на своем объекте? – BrenBarn

+0

@BrenBarn Я не могу передать объект warnions.warn() - только строка и тип предупреждения. В этом и заключается проблема – Muposat

+0

Пожалуйста, покажите фактический код, который вы используете с 'warnings.warn'. Как [documented] (https://docs.python.org/3/library/warnings.html#warnings.warn) вы можете передать экземпляр предупреждения (включая экземпляр подкласса Warning). – BrenBarn

ответ

0

Благодаря @BrenBarn за то, что это сообщение может быть объектом. Таким образом, подклассы из предупреждения выглядит довольно некрасиво, но по крайней мере, она годна к употреблению:

with warnings.catch_warnings(record=True) as w: 
    warning_obj = UserCannotSpell('Houston, we have a problem') 
    warning_obj.custom_data = 33 
    warnings.warn(warning_obj) 

Выход:

>>> w 
[<warnings.WarningMessage object at 0x02E011F0>] 

>>> w[0].message.custom_data 
33 
Смежные вопросы