Mailing List Archive

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.
_______________________________________________
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/JMKLA4RUJLTORBPPTM4BWL76VNNMKYVG/
Code of Conduct: http://python.org/psf/codeofconduct/
Re: Can we change python -W option and PYTHONWARNINGS to use a regex for the message? [ In reply to ]
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/ADUDHMNJIYERRA5MHF4GGB2OXV2XJC37/
Code of Conduct: http://python.org/psf/codeofconduct/
Re: Can we change python -W option and PYTHONWARNINGS to use a regex for the message? [ In reply to ]
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.

_______________________________________________
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/UCFRLK3HCVLJ25VM3OL45XVXC4KMFLTR/
Code of Conduct: http://python.org/psf/codeofconduct/
Re: Can we change python -W option and PYTHONWARNINGS to use a regex for the message? [ In reply to ]
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/ADUDHMNJIYERRA5MHF4GGB2OXV2XJC37/
> Code of Conduct: http://python.org/psf/codeofconduct/



--
Night gathers, and now my watch begins. It shall not end until my death.
_______________________________________________
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/IIWWB5IZ32H3O4QHYUGRA2D7DYMVSUIY/
Code of Conduct: http://python.org/psf/codeofconduct/