diff -r 9b053d3c74dc Lib/warnings.py --- a/Lib/warnings.py Wed Nov 16 15:56:50 2016 +0200 +++ b/Lib/warnings.py Thu Nov 17 17:22:24 2016 +0100 @@ -148,18 +148,31 @@ def simplefilter(action, category=Warnin "lineno must be an int >= 0" _add_filter(action, None, category, None, lineno, append=append) +def _pattern_key(pattern): + if pattern is not None: + return (pattern.pattern, pattern.flags) + else: + return () + +def _cmp_key(item): + return (item[0], _pattern_key(item[1]), item[2], _pattern_key(item[3])) + def _add_filter(*item, append): # Remove possible duplicate filters, so new one will be placed # in correct place. If append=True and duplicate exists, do nothing. + key = _cmp_key(item) if not append: - try: - filters.remove(item) - except ValueError: - pass + for index in range(len(filters)): + if _cmp_key(filters[index]) == key: + del filters[index] + break + print(_cmp_key(filters[index]), "!=", key) + filters.insert(0, item) else: - if item not in filters: - filters.append(item) + if any(_cmp_key(filter) == key for filter in filters): + return + filters.append(item) _filters_mutated() def resetwarnings():