diff --git a/Lib/warnings.py b/Lib/warnings.py index 3bfba9749abe33..277257548df5ff 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -130,6 +130,12 @@ def _formatwarnmsg(msg): msg.filename, msg.lineno, msg.line) return _formatwarnmsg_impl(msg) +def _valid_warning_category(category): + """Return True if category is a Warning subclass or tuple of such.""" + if isinstance(category, tuple): + return all(isinstance(c, type) and issubclass(c, Warning) for c in category) + return isinstance(category, type) and issubclass(category, Warning) + def filterwarnings(action, message="", category=Warning, module="", lineno=0, append=False): """Insert an entry into the list of warnings filters (at the front). @@ -145,8 +151,9 @@ def filterwarnings(action, message="", category=Warning, module="", lineno=0, assert action in ("error", "ignore", "always", "default", "module", "once"), "invalid action: %r" % (action,) assert isinstance(message, str), "message must be a string" - assert isinstance(category, type), "category must be a class" - assert issubclass(category, Warning), "category must be a Warning subclass" + if not _valid_warning_category(category): + raise TypeError("category must be a Warning subclass, " + "not '{:s}'".format(type(category).__name__)) assert isinstance(module, str), "module must be a string" assert isinstance(lineno, int) and lineno >= 0, \ "lineno must be an int >= 0" @@ -177,6 +184,9 @@ def simplefilter(action, category=Warning, lineno=0, append=False): """ assert action in ("error", "ignore", "always", "default", "module", "once"), "invalid action: %r" % (action,) + if not _valid_warning_category(category): + raise TypeError("category must be a Warning subclass, " + "not '{:s}'".format(type(category).__name__)) assert isinstance(lineno, int) and lineno >= 0, \ "lineno must be an int >= 0" _add_filter(action, None, category, None, lineno, append=append) diff --git a/Misc/ACKS b/Misc/ACKS index a6e63a991f9288..6da74cdb5d645e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -2093,5 +2093,6 @@ Jelle Zijlstra Gennadiy Zlobin Doug Zongker Peter Åstrand +Hasrat Ali Arzoo (Entries should be added in rough alphabetical order by last names)