diff -r 1309fee48908 Lib/test/test_warnings.py --- a/Lib/test/test_warnings.py Mon Oct 14 20:50:32 2013 +0200 +++ b/Lib/test/test_warnings.py Tue Oct 15 16:57:29 2013 +0800 @@ -359,6 +359,20 @@ with self.assertRaises(ValueError): self.module.warn(BadStrWarning()) + def test_simplefilter_invalid_category(self): + with original_warnings.catch_warnings(record=True, + module=self.module) as w: + invalid_category = 'spam' + with self.assertRaises(AssertionError) as cm: + self.module.simplefilter("once", invalid_category) + self.assertEqual(str(cm.exception), "category must be a class") + class Spam: pass + invalid_category = Spam + with self.assertRaises(AssertionError) as cm: + self.module.simplefilter("once", invalid_category) + self.assertEqual(str(cm.exception), + "category must be a Warning subclass") + class CWarnTests(WarnTests, unittest.TestCase): module = c_warnings diff -r 1309fee48908 Lib/warnings.py --- a/Lib/warnings.py Mon Oct 14 20:50:32 2013 +0200 +++ b/Lib/warnings.py Tue Oct 15 16:57:29 2013 +0800 @@ -70,6 +70,9 @@ "once"), "invalid action: %r" % (action,) assert isinstance(lineno, int) and lineno >= 0, \ "lineno must be an int >= 0" + assert isinstance(category, type), "category must be a class" + assert issubclass(category, Warning), \ + "category must be a Warning subclass" item = (action, None, category, None, lineno) if append: filters.append(item)