summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Podoprigora <kirill.bast9@mail.ru>2024-06-30 17:48:00 (GMT)
committerGitHub <noreply@github.com>2024-06-30 17:48:00 (GMT)
commit1a84bdc2371ada60c01c72493caba62c9860007b (patch)
tree8d3311d199c03027caf92bb505bf58cd1ef80cfb
parent2a455bbe8fd91a688ae20509a2fdc8beaa8c8447 (diff)
downloadcpython-1a84bdc2371ada60c01c72493caba62c9860007b.zip
cpython-1a84bdc2371ada60c01c72493caba62c9860007b.tar.gz
cpython-1a84bdc2371ada60c01c72493caba62c9860007b.tar.bz2
gh-121163: Add "all" as an valid alias for "always" in warnings.simplefilter() (#121164)
Add support for ``all`` as an valid alias for ``always`` in ``warnings.simplefilter()`` and ``warnings.filterswarnings()``.
-rw-r--r--Doc/library/warnings.rst2
-rw-r--r--Lib/test/test_warnings/__init__.py68
-rw-r--r--Lib/warnings.py15
-rw-r--r--Misc/NEWS.d/next/Library/2024-06-29-19-30-15.gh-issue-121163.SJKDFq.rst3
-rw-r--r--Python/_warnings.c4
5 files changed, 49 insertions, 43 deletions
diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst
index c66e65a..68b9ff5 100644
--- a/Doc/library/warnings.rst
+++ b/Doc/library/warnings.rst
@@ -145,6 +145,8 @@ the disposition of the match. Each entry is a tuple of the form (*action*,
+---------------+----------------------------------------------+
| ``"always"`` | always print matching warnings |
+---------------+----------------------------------------------+
+ | ``"all"`` | alias to "always" |
+ +---------------+----------------------------------------------+
| ``"module"`` | print the first occurrence of matching |
| | warnings for each module where the warning |
| | is issued (regardless of line number) |
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index 36618d5..f9b2b07 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -155,40 +155,42 @@ class FilterTests(BaseTest):
f()
self.assertEqual(len(w), 1)
- def test_always(self):
- with original_warnings.catch_warnings(record=True,
- module=self.module) as w:
- self.module.resetwarnings()
- self.module.filterwarnings("always", category=UserWarning)
- message = "FilterTests.test_always"
- def f():
- self.module.warn(message, UserWarning)
- f()
- self.assertEqual(len(w), 1)
- self.assertEqual(w[-1].message.args[0], message)
- f()
- self.assertEqual(len(w), 2)
- self.assertEqual(w[-1].message.args[0], message)
+ def test_always_and_all(self):
+ for mode in {"always", "all"}:
+ with original_warnings.catch_warnings(record=True,
+ module=self.module) as w:
+ self.module.resetwarnings()
+ self.module.filterwarnings(mode, category=UserWarning)
+ message = "FilterTests.test_always_and_all"
+ def f():
+ self.module.warn(message, UserWarning)
+ f()
+ self.assertEqual(len(w), 1)
+ self.assertEqual(w[-1].message.args[0], message)
+ f()
+ self.assertEqual(len(w), 2)
+ self.assertEqual(w[-1].message.args[0], message)
- def test_always_after_default(self):
- with original_warnings.catch_warnings(record=True,
- module=self.module) as w:
- self.module.resetwarnings()
- message = "FilterTests.test_always_after_ignore"
- def f():
- self.module.warn(message, UserWarning)
- f()
- self.assertEqual(len(w), 1)
- self.assertEqual(w[-1].message.args[0], message)
- f()
- self.assertEqual(len(w), 1)
- self.module.filterwarnings("always", category=UserWarning)
- f()
- self.assertEqual(len(w), 2)
- self.assertEqual(w[-1].message.args[0], message)
- f()
- self.assertEqual(len(w), 3)
- self.assertEqual(w[-1].message.args[0], message)
+ def test_always_and_all_after_default(self):
+ for mode in {"always", "all"}:
+ with original_warnings.catch_warnings(record=True,
+ module=self.module) as w:
+ self.module.resetwarnings()
+ message = "FilterTests.test_always_and_all_after_ignore"
+ def f():
+ self.module.warn(message, UserWarning)
+ f()
+ self.assertEqual(len(w), 1)
+ self.assertEqual(w[-1].message.args[0], message)
+ f()
+ self.assertEqual(len(w), 1)
+ self.module.filterwarnings(mode, category=UserWarning)
+ f()
+ self.assertEqual(len(w), 2)
+ self.assertEqual(w[-1].message.args[0], message)
+ f()
+ self.assertEqual(len(w), 3)
+ self.assertEqual(w[-1].message.args[0], message)
def test_default(self):
with original_warnings.catch_warnings(record=True,
diff --git a/Lib/warnings.py b/Lib/warnings.py
index 20a39d5..d344cea 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -132,7 +132,7 @@ def filterwarnings(action, message="", category=Warning, module="", lineno=0,
append=False):
"""Insert an entry into the list of warnings filters (at the front).
- 'action' -- one of "error", "ignore", "always", "default", "module",
+ 'action' -- one of "error", "ignore", "always", "all", "default", "module",
or "once"
'message' -- a regex that the warning message must match
'category' -- a class that the warning must be a subclass of
@@ -140,7 +140,7 @@ 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
"""
- if action not in {"error", "ignore", "always", "default", "module", "once"}:
+ if action not in {"error", "ignore", "always", "all", "default", "module", "once"}:
raise ValueError(f"invalid action: {action!r}")
if not isinstance(message, str):
raise TypeError("message must be a string")
@@ -171,13 +171,13 @@ def simplefilter(action, category=Warning, lineno=0, append=False):
"""Insert a simple entry into the list of warnings filters (at the front).
A simple filter matches all modules and messages.
- 'action' -- one of "error", "ignore", "always", "default", "module",
+ 'action' -- one of "error", "ignore", "always", "all", "default", "module",
or "once"
'category' -- a class that the warning must be a subclass of
'lineno' -- an integer line number, 0 matches all warnings
'append' -- if true, append to the list of filters
"""
- if action not in {"error", "ignore", "always", "default", "module", "once"}:
+ if action not in {"error", "ignore", "always", "all", "default", "module", "once"}:
raise ValueError(f"invalid action: {action!r}")
if not isinstance(lineno, int):
raise TypeError("lineno must be an int")
@@ -248,8 +248,7 @@ def _setoption(arg):
def _getaction(action):
if not action:
return "default"
- if action == "all": return "always" # Alias
- for a in ('default', 'always', 'ignore', 'module', 'once', 'error'):
+ for a in ('default', 'always', 'all', 'ignore', 'module', 'once', 'error'):
if a.startswith(action):
return a
raise _OptionError("invalid action: %r" % (action,))
@@ -397,7 +396,7 @@ def warn_explicit(message, category, filename, lineno,
if onceregistry.get(oncekey):
return
onceregistry[oncekey] = 1
- elif action == "always":
+ elif action in {"always", "all"}:
pass
elif action == "module":
registry[key] = 1
@@ -690,7 +689,7 @@ def _warn_unawaited_coroutine(coro):
# filters contains a sequence of filter 5-tuples
# The components of the 5-tuple are:
-# - an action: error, ignore, always, default, module, or once
+# - an action: error, ignore, always, all, default, module, or once
# - a compiled regex that must match the warning message
# - a class representing the warning category
# - a compiled regex that must match the module that is being warned
diff --git a/Misc/NEWS.d/next/Library/2024-06-29-19-30-15.gh-issue-121163.SJKDFq.rst b/Misc/NEWS.d/next/Library/2024-06-29-19-30-15.gh-issue-121163.SJKDFq.rst
new file mode 100644
index 0000000..0298380
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-06-29-19-30-15.gh-issue-121163.SJKDFq.rst
@@ -0,0 +1,3 @@
+Add support for ``all`` as an valid ``action`` for :func:`warnings.simplefilter`
+and :func:`warnings.filterswarnings`.
+
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 17404d3..3f9e73b 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -704,9 +704,9 @@ warn_explicit(PyThreadState *tstate, PyObject *category, PyObject *message,
}
/* Store in the registry that we've been here, *except* when the action
- is "always". */
+ is "always" or "all". */
rc = 0;
- if (!_PyUnicode_EqualToASCIIString(action, "always")) {
+ if (!_PyUnicode_EqualToASCIIString(action, "always") && !_PyUnicode_EqualToASCIIString(action, "all")) {
if (registry != NULL && registry != Py_None &&
PyDict_SetItem(registry, key, Py_True) < 0)
{