https://github.com/python/cpython/commit/1a84bdc2371ada60c01c72493caba62c9860007b
commit: 1a84bdc2371ada60c01c72493caba62c9860007b
branch: main
author: Kirill Podoprigora <[email protected]>
committer: vstinner <[email protected]>
date: 2024-06-30T19:48:00+02:00
summary:
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()``.
files:
A Misc/NEWS.d/next/Library/2024-06-29-19-30-15.gh-issue-121163.SJKDFq.rst
M Doc/library/warnings.rst
M Lib/test/test_warnings/__init__.py
M Lib/warnings.py
M Python/_warnings.c
diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst
index c66e65abee426f..68b9ff5ce2f78c 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 36618d509fafe1..f9b2b07fbd6576 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -155,40 +155,42 @@ def f():
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 20a39d54bf7e6a..d344ceaebb0378 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 extract():
# 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 00000000000000..029838030278a6
--- /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 17404d33c1cc9b..3f9e73b5376223 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)
{
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]