There is a long-standing bug in Python python/cpython#73858 whereby any use of warnings.catch_warnings causes all memory of which warnings have already been displayed to be lost. So warnings whose action is configured as "default" (meaning show once for each module/line-number) get displayed multiple (possibly many, many) times.
Note that use of catch_warnings resets memory of what warnings have been displayed globally — use of catch_warnings by werkzeug can cause redisplay of unrelated warnings from other modules.
PR #2608 (19d55c1) introduced a lot of new uses of catch_warnings.
I'm not sure what the clean way is to work-around the issue, but it would be nice not to break the "default" warning action so drastically.
Example: too-verbose.py:
from werkzeug.urls import url_parse
for _ in range(10):
url_parse("x")
Running
will elicit 10 url_parse deprecation warnings. (The default warnings filter specifies an action of "default" for DeprecationWarnings, which means that they should be displayed just once per location.)
Environment:
- Python version: I've tested under 3.9 and 3.11. I think it affects all 3.x pythons.
- Werkzeug version: 2.3.3
There is a long-standing bug in Python python/cpython#73858 whereby any use of
warnings.catch_warningscauses all memory of which warnings have already been displayed to be lost. So warnings whose action is configured as "default" (meaning show once for each module/line-number) get displayed multiple (possibly many, many) times.Note that use of
catch_warningsresets memory of what warnings have been displayed globally — use ofcatch_warningsby werkzeug can cause redisplay of unrelated warnings from other modules.PR #2608 (19d55c1) introduced a lot of new uses of
catch_warnings.I'm not sure what the clean way is to work-around the issue, but it would be nice not to break the "default" warning action so drastically.
Example:
too-verbose.py:Running
will elicit 10
url_parsedeprecation warnings. (The default warnings filter specifies an action of "default" for DeprecationWarnings, which means that they should be displayed just once per location.)Environment: