2015-04-11 3 views
1

Предположим, у меня есть файл A.py только с следующим содержанием:предупреждения Поймайте импорта в Python

 
import warnings 
warnings.warn("A is deprecated", DeprecationWarning) 

Я хочу, чтобы поймать это предупреждение, когда я импортировать и утверждать, что это DeprecationWarning. В настоящее время я делаю следующее:

 
import warnings 
with warnings.catch_warnings(record=True) as w: 
    import A 

и пытаюсь утверждать, используя что-то вроде assert_equal(w[0].category, DeprecationWarning), но это показывает, что w пуст. Думаю, он не поймает предупреждение. Есть ли другой способ сделать это?

EDIT: Я забыл добавить, что я пробовал его с warnings.simplefilter("always"), но предупреждения не было.

EDIT 2: Он может иметь какое-то отношение к уровням предупреждения. [смотреть комментарии]

EDIT 3: Пробовал его с различными stacklevel s - 0, 1, 2, 3. Без эффекта: |

+0

Если вы используете [ 'unittest'] (https://docs.python.org/3/library/unittest.html), есть [' unittest.TestCase.assertWarns() '] (HTTPS: //docs.python .org/3/библиотека/unittest.html # unittest.TestCase.assertWarns). –

+1

Каков ваш уровень предупреждения? Я считаю, что 'DeprecationWarning' [игнорируется по умолчанию] (https://docs.python.org/3.4/library/warnings.html#default-warning-filters). Попробуйте вызвать 'warnings.simplefilter ('default')' перед 'catch_warnings' (или вызвать' python -Wd' для запуска вашего скрипта), как описано [здесь] (https://docs.python.org/3.4/library/warnings .html # обновление-кода для-новых-версий-оф-питон). См. Полный пример [здесь] (https://docs.python.org/3.4/library/warnings.html#testing-warnings). –

+0

Извините, я забыл добавить, что я пробовал его с помощью 'warnings.simplefilter ('always')', но предупреждение не записывалось, будет «ИЗМЕНИТЬ» вопрос. –

ответ

0

Вам просто нужно добавить строку

warnings.simplefilter("always") 

к коду, например:

with warnings.catch_warnings(record=True) as w: 
    warnings.simplefilter("always") 
    import A 

Таким образом, рабочая версия 'B.py' (как это было) может выглядеть как это:

import warnings 
import unittest 

class TestWarnings(unittest.TestCase): 

    def test_warnings(self): 
     with warnings.catch_warnings(record=True) as w: 
      warnings.simplefilter("always") 
      import A 
      self.assertEqual(w[0].category, DeprecationWarning) 

if __name__ == '__main__': 
    unittest.main()  
Смежные вопросы