mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
bpo-39912: Raise appropriate exceptions in filterwarnings() and simplefilter() (GH-18878)
This commit is contained in:
parent
847e4fe0e8
commit
a65a3d4806
3 changed files with 43 additions and 12 deletions
|
@ -375,6 +375,28 @@ class FilterTests(BaseTest):
|
||||||
"appended duplicate changed order of filters"
|
"appended duplicate changed order of filters"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_argument_validation(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.module.filterwarnings(action='foo')
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
self.module.filterwarnings('ignore', message=0)
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
self.module.filterwarnings('ignore', category=0)
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
self.module.filterwarnings('ignore', category=int)
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
self.module.filterwarnings('ignore', module=0)
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
self.module.filterwarnings('ignore', lineno=int)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.module.filterwarnings('ignore', lineno=-1)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.module.simplefilter(action='foo')
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
self.module.simplefilter('ignore', lineno=int)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.module.simplefilter('ignore', lineno=-1)
|
||||||
|
|
||||||
def test_catchwarnings_with_simplefilter_ignore(self):
|
def test_catchwarnings_with_simplefilter_ignore(self):
|
||||||
with original_warnings.catch_warnings(module=self.module):
|
with original_warnings.catch_warnings(module=self.module):
|
||||||
self.module.resetwarnings()
|
self.module.resetwarnings()
|
||||||
|
|
|
@ -139,14 +139,18 @@ def filterwarnings(action, message="", category=Warning, module="", lineno=0,
|
||||||
'lineno' -- an integer line number, 0 matches all warnings
|
'lineno' -- an integer line number, 0 matches all warnings
|
||||||
'append' -- if true, append to the list of filters
|
'append' -- if true, append to the list of filters
|
||||||
"""
|
"""
|
||||||
assert action in ("error", "ignore", "always", "default", "module",
|
if action not in {"error", "ignore", "always", "default", "module", "once"}:
|
||||||
"once"), "invalid action: %r" % (action,)
|
raise ValueError(f"invalid action: {action!r}")
|
||||||
assert isinstance(message, str), "message must be a string"
|
if not isinstance(message, str):
|
||||||
assert isinstance(category, type), "category must be a class"
|
raise TypeError("message must be a string")
|
||||||
assert issubclass(category, Warning), "category must be a Warning subclass"
|
if not isinstance(category, type) or not issubclass(category, Warning):
|
||||||
assert isinstance(module, str), "module must be a string"
|
raise TypeError("category must be a Warning subclass")
|
||||||
assert isinstance(lineno, int) and lineno >= 0, \
|
if not isinstance(module, str):
|
||||||
"lineno must be an int >= 0"
|
raise TypeError("module must be a string")
|
||||||
|
if not isinstance(lineno, int):
|
||||||
|
raise TypeError("lineno must be an int")
|
||||||
|
if lineno < 0:
|
||||||
|
raise ValueError("lineno must be an int >= 0")
|
||||||
|
|
||||||
if message or module:
|
if message or module:
|
||||||
import re
|
import re
|
||||||
|
@ -172,10 +176,12 @@ def simplefilter(action, category=Warning, lineno=0, append=False):
|
||||||
'lineno' -- an integer line number, 0 matches all warnings
|
'lineno' -- an integer line number, 0 matches all warnings
|
||||||
'append' -- if true, append to the list of filters
|
'append' -- if true, append to the list of filters
|
||||||
"""
|
"""
|
||||||
assert action in ("error", "ignore", "always", "default", "module",
|
if action not in {"error", "ignore", "always", "default", "module", "once"}:
|
||||||
"once"), "invalid action: %r" % (action,)
|
raise ValueError(f"invalid action: {action!r}")
|
||||||
assert isinstance(lineno, int) and lineno >= 0, \
|
if not isinstance(lineno, int):
|
||||||
"lineno must be an int >= 0"
|
raise TypeError("lineno must be an int")
|
||||||
|
if lineno < 0:
|
||||||
|
raise ValueError("lineno must be an int >= 0")
|
||||||
_add_filter(action, None, category, None, lineno, append=append)
|
_add_filter(action, None, category, None, lineno, append=append)
|
||||||
|
|
||||||
def _add_filter(*item, append):
|
def _add_filter(*item, append):
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
:func:`warnings.filterwarnings()` and :func:`warnings.simplefilter()` now raise
|
||||||
|
appropriate exceptions instead of ``AssertionError``. Patch contributed by
|
||||||
|
Rémi Lapeyre.
|
Loading…
Add table
Add a link
Reference in a new issue