diff -r eba80326ba53 Lib/test/test_warnings.py --- a/Lib/test/test_warnings.py Sun Apr 05 19:26:29 2015 -0400 +++ b/Lib/test/test_warnings.py Mon Apr 06 13:10:20 2015 +0300 @@ -247,6 +247,21 @@ self.assertEqual(str(w[-1].message), text) self.assertTrue(w[-1].category is UserWarning) + def test_duplicate_filters(self): + with warnings_state(self.module): + initial_len = len(self.module.filters) + self.module.filterwarnings("error", category=UserWarning) + self.assertEqual(len(self.module.filters), initial_len + 1) + self.module.filterwarnings("error", category=UserWarning) + self.assertEqual(len(self.module.filters), initial_len + 1, "filterwarnings inserted duplicate filter") + with warnings_state(self.module): + initial_len = len(self.module.filters) + self.module.simplefilter("error", category=UserWarning) + self.assertEqual(len(self.module.filters), initial_len + 1) + self.module.simplefilter("error", category=UserWarning) + self.assertEqual(len(self.module.filters), initial_len + 1, "simplefilter inserted duplicate filter") + + class CFilterTests(FilterTests, unittest.TestCase): module = c_warnings diff -r eba80326ba53 Lib/warnings.py --- a/Lib/warnings.py Sun Apr 05 19:26:29 2015 -0400 +++ b/Lib/warnings.py Mon Apr 06 13:10:20 2015 +0300 @@ -52,11 +52,12 @@ "lineno must be an int >= 0" item = (action, re.compile(message, re.I), category, re.compile(module), lineno) - if append: - filters.append(item) - else: - filters.insert(0, item) - _filters_mutated() + if item not in filters: + if append: + filters.append(item) + else: + filters.insert(0, item) + _filters_mutated() def simplefilter(action, category=Warning, lineno=0, append=False): """Insert a simple entry into the list of warnings filters (at the front). @@ -73,11 +74,12 @@ assert isinstance(lineno, int) and lineno >= 0, \ "lineno must be an int >= 0" item = (action, None, category, None, lineno) - if append: - filters.append(item) - else: - filters.insert(0, item) - _filters_mutated() + if item not in filters: + if append: + filters.append(item) + else: + filters.insert(0, item) + _filters_mutated() def resetwarnings(): """Clear the list of warning filters, so that no filters are active."""