summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Lapeyre <remi.lapeyre@lenstra.fr>2023-12-01 11:17:47 (GMT)
committerGitHub <noreply@github.com>2023-12-01 11:17:47 (GMT)
commita65a3d4806a4087f229b5ab6ab28d3e0b0a2d840 (patch)
treebcea132374d4eb92da9a8aac6afdd79cddea6588
parent847e4fe0e81f0e6e54ef52a9be63e3fb74b0779a (diff)
downloadcpython-a65a3d4806a4087f229b5ab6ab28d3e0b0a2d840.zip
cpython-a65a3d4806a4087f229b5ab6ab28d3e0b0a2d840.tar.gz
cpython-a65a3d4806a4087f229b5ab6ab28d3e0b0a2d840.tar.bz2
bpo-39912: Raise appropriate exceptions in filterwarnings() and simplefilter() (GH-18878)
-rw-r--r--Lib/test/test_warnings/__init__.py22
-rw-r--r--Lib/warnings.py30
-rw-r--r--Misc/NEWS.d/next/Library/2020-03-09-15-08-29.bpo-39912.xPOBBY.rst3
3 files changed, 43 insertions, 12 deletions
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index cd989fe..232480c 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -375,6 +375,28 @@ class FilterTests(BaseTest):
"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):
with original_warnings.catch_warnings(module=self.module):
self.module.resetwarnings()
diff --git a/Lib/warnings.py b/Lib/warnings.py
index 924f872..b8ff078 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -139,14 +139,18 @@ def filterwarnings(action, message="", category=Warning, module="", lineno=0,
'lineno' -- an integer line number, 0 matches all warnings
'append' -- if true, append to the list of filters
"""
- 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"
- assert isinstance(module, str), "module must be a string"
- assert isinstance(lineno, int) and lineno >= 0, \
- "lineno must be an int >= 0"
+ if action not in {"error", "ignore", "always", "default", "module", "once"}:
+ raise ValueError(f"invalid action: {action!r}")
+ if not isinstance(message, str):
+ raise TypeError("message must be a string")
+ if not isinstance(category, type) or not issubclass(category, Warning):
+ raise TypeError("category must be a Warning subclass")
+ if not isinstance(module, str):
+ 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:
import re
@@ -172,10 +176,12 @@ def simplefilter(action, category=Warning, lineno=0, append=False):
'lineno' -- an integer line number, 0 matches all warnings
'append' -- if true, append to the list of filters
"""
- assert action in ("error", "ignore", "always", "default", "module",
- "once"), "invalid action: %r" % (action,)
- assert isinstance(lineno, int) and lineno >= 0, \
- "lineno must be an int >= 0"
+ if action not in {"error", "ignore", "always", "default", "module", "once"}:
+ raise ValueError(f"invalid action: {action!r}")
+ if not isinstance(lineno, int):
+ 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)
def _add_filter(*item, append):
diff --git a/Misc/NEWS.d/next/Library/2020-03-09-15-08-29.bpo-39912.xPOBBY.rst b/Misc/NEWS.d/next/Library/2020-03-09-15-08-29.bpo-39912.xPOBBY.rst
new file mode 100644
index 0000000..fb85797
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-03-09-15-08-29.bpo-39912.xPOBBY.rst
@@ -0,0 +1,3 @@
+:func:`warnings.filterwarnings()` and :func:`warnings.simplefilter()` now raise
+appropriate exceptions instead of ``AssertionError``. Patch contributed by
+Rémi Lapeyre.