Can we change python -W option and PYTHONWARNINGS to use a regex for the message?

Hi, I propose to change the -W command line option and the PYTHONWARNINGS environment variable to use the message as a regular expression in Python 3.10. Or does anyone have a reason to keep the current behavior as it is? I created https://bugs.python.org/issue43862 for this change. -- Python provides two ways to specify warnings filters: * -W command line option: can be used multiple times * PYTHONWARNINGS environment variable: can contain multiple options separated by commas While the Python API warnings.filterwarnings(action, message="", ...) uses the message as a regular expression, -W and PYTHONWARNINGS require to match *exactly* the *whole* message. For example, if you only want to ignore the new distutils deprecation warning, you must write exactly: $ ./python -X dev -W 'ignore:The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning' -c 'import distutils' I use -X dev to show DeprecationWarning, or you can also use -Wdefault if you prefer. If the deprecation warning changes in Python or if you have a single typo, the warning is not ignored. Example with a typo ("3.13" rather than "3.12"): $ ./python -X dev -W 'ignore:The distutils package is deprecated and slated for removal in Python 3.13. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning' -c 'import distutils' <string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives The PYTHONWARNINGS has another limitation: you cannot specify a message if it contains a comma (","). Hopefully, Python doesn't raise warnings containing comma, right? Well... Just one example: Lib/distutils/sysconfig.py:554: warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2) You cannot only ignore the message: $ PYTHONWARNINGS='ignore:SO is deprecated, use EXT_SUFFIX:DeprecationWarning' ./python -c 'import sys; print(sys.warnoptions); print(len(sys.warnoptions))' Invalid -W option ignored: invalid action: 'use EXT_SUFFIX' ['ignore:SO is deprecated', ' use EXT_SUFFIX:DeprecationWarning'] 2 You can only try to use "module" and "lineno" parameters of a warning filter, which are more fragile and hard to use to use. Victor -- Night gathers, and now my watch begins. It shall not end until my death.

It'll probably be easier to change the warnings filter semantic (https://docs.python.org/3/library/warnings.html#the-warnings-filter) to which those values are directly passed. On 16.04.2021 16:07, Victor Stinner wrote:
Hi,
I propose to change the -W command line option and the PYTHONWARNINGS environment variable to use the message as a regular expression in Python 3.10. Or does anyone have a reason to keep the current behavior as it is?
I created https://bugs.python.org/issue43862 for this change.
--
Python provides two ways to specify warnings filters:
* -W command line option: can be used multiple times * PYTHONWARNINGS environment variable: can contain multiple options separated by commas
While the Python API warnings.filterwarnings(action, message="", ...) uses the message as a regular expression, -W and PYTHONWARNINGS require to match *exactly* the *whole* message.
For example, if you only want to ignore the new distutils deprecation warning, you must write exactly:
$ ./python -X dev -W 'ignore:The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning' -c 'import distutils'
I use -X dev to show DeprecationWarning, or you can also use -Wdefault if you prefer.
If the deprecation warning changes in Python or if you have a single typo, the warning is not ignored. Example with a typo ("3.13" rather than "3.12"):
$ ./python -X dev -W 'ignore:The distutils package is deprecated and slated for removal in Python 3.13. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning' -c 'import distutils' <string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
The PYTHONWARNINGS has another limitation: you cannot specify a message if it contains a comma (","). Hopefully, Python doesn't raise warnings containing comma, right? Well... Just one example:
Lib/distutils/sysconfig.py:554: warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2)
You cannot only ignore the message:
$ PYTHONWARNINGS='ignore:SO is deprecated, use EXT_SUFFIX:DeprecationWarning' ./python -c 'import sys; print(sys.warnoptions); print(len(sys.warnoptions))' Invalid -W option ignored: invalid action: 'use EXT_SUFFIX' ['ignore:SO is deprecated', ' use EXT_SUFFIX:DeprecationWarning'] 2
You can only try to use "module" and "lineno" parameters of a warning filter, which are more fragile and hard to use to use.
Victor
-- Regards, Ivan

The warnings.filterwarnings() function uses a regular expression for message and module arguments. My request is only about the Python command line interface. By the way, an user requested to use a regex for the module field of -W option and PYTHONWARNINGS env var: https://bugs.python.org/issue34624 Victor On Fri, Apr 16, 2021 at 3:22 PM Ivan Pozdeev via Python-Dev <python-dev@python.org> wrote:
It'll probably be easier to change the warnings filter semantic (https://docs.python.org/3/library/warnings.html#the-warnings-filter) to which those values are directly passed.
On 16.04.2021 16:07, Victor Stinner wrote:
Hi,
I propose to change the -W command line option and the PYTHONWARNINGS environment variable to use the message as a regular expression in Python 3.10. Or does anyone have a reason to keep the current behavior as it is?
I created https://bugs.python.org/issue43862 for this change.
--
Python provides two ways to specify warnings filters:
* -W command line option: can be used multiple times * PYTHONWARNINGS environment variable: can contain multiple options separated by commas
While the Python API warnings.filterwarnings(action, message="", ...) uses the message as a regular expression, -W and PYTHONWARNINGS require to match *exactly* the *whole* message.
For example, if you only want to ignore the new distutils deprecation warning, you must write exactly:
$ ./python -X dev -W 'ignore:The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning' -c 'import distutils'
I use -X dev to show DeprecationWarning, or you can also use -Wdefault if you prefer.
If the deprecation warning changes in Python or if you have a single typo, the warning is not ignored. Example with a typo ("3.13" rather than "3.12"):
$ ./python -X dev -W 'ignore:The distutils package is deprecated and slated for removal in Python 3.13. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning' -c 'import distutils' <string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
The PYTHONWARNINGS has another limitation: you cannot specify a message if it contains a comma (","). Hopefully, Python doesn't raise warnings containing comma, right? Well... Just one example:
Lib/distutils/sysconfig.py:554: warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2)
You cannot only ignore the message:
$ PYTHONWARNINGS='ignore:SO is deprecated, use EXT_SUFFIX:DeprecationWarning' ./python -c 'import sys; print(sys.warnoptions); print(len(sys.warnoptions))' Invalid -W option ignored: invalid action: 'use EXT_SUFFIX' ['ignore:SO is deprecated', ' use EXT_SUFFIX:DeprecationWarning'] 2
You can only try to use "module" and "lineno" parameters of a warning filter, which are more fragile and hard to use to use.
Victor
-- Regards, Ivan
_______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-leave@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/ADUDHMNJ... Code of Conduct: http://python.org/psf/codeofconduct/
-- Night gathers, and now my watch begins. It shall not end until my death.

16.04.21 16:07, Victor Stinner пише:
I propose to change the -W command line option and the PYTHONWARNINGS environment variable to use the message as a regular expression in Python 3.10. Or does anyone have a reason to keep the current behavior as it is?
I created https://bugs.python.org/issue43862 for this change.
It is known issue, but changing it is would break compatibility. The warning message can contain characters which have special meaning in regular expressions (e.g. "(" and "?"). Event if it can be parsed as a regular expression, it can stop to work. It would be more safe to add some flag which control whether the message is a pattern or literal. For example, if it starts with "/" it is a pattern (no warning message or module name starts with "/"). Module name also should support regular expressions. Note also that specifying message or module name in the -W option or the PYTHONWARNINGS environment variable causes importing the re module at the start of the interpreter, and it nontrivially increases the starting time.
participants (3)
-
Ivan Pozdeev
-
Serhiy Storchaka
-
Victor Stinner