[Python-Dev] PEP 565: Show DeprecationWarning in main (original) (raw)

Victor Stinner victor.stinner at gmail.com
Wed Nov 29 18:56:37 EST 2017


2017-11-12 10:24 GMT+01:00 Nick Coghlan <ncoghlan at gmail.com>:

I've written a short(ish) PEP for the proposal to change the default warnings filters to show DeprecationWarning in main: https://www.python.org/dev/peps/pep-0565/

I understand the rationale of the PEP, but I dislike the proposed implementation.

End users will start to get warnings that they don't understand and cannot fix, so these warnings would just be annoying.

For scripts written to only be run once and then deleted, again, these warnings are just annoying since the script is going to be deleted anyway.

It's like the annoying ResourceWarning (in debug mode) when I write open(filename).read() in the REPL. I know that it's bad, but the code will only be run once and lost when I quit the REPL, so who cares? (not me, stop bothering me with good programming practices, I do know them, let me write crappy code!) On the REPL case, I have no strong opinion.

For developers who want to see warnings, the warnings are not shown for applications using an entry point and any code base larger than a single file (warnings outside the main module).

--

In practice, I'm running tests with python -Wd (to see ResourceWarning in my case), and I'm happy with that :-) If tests pass with -Wd, you're good.

This is why I implemented a new "development mode", python3 -X dev, in Python 3.7 which "shows all warnings except of BytesWarning". (This mode is already mentioned in Nick's PEP.) https://docs.python.org/dev/using/cmdline.html#id5

My advice is to always run your tests with -X dev. If they pass with -X dev, you are good.

I'm not even sure that developers should use -X dev to test their code manually. I see it as a "cheap linter". I don't want to run a linter each time I run Python.

The "-X dev" option is smarter than -Wd: it adds the default filter at the end, to respect -b and -bb options for the BytesWarning.

Release build:

$ ./python -c 'import pprint, warnings; pprint.pprint(warnings.filters)' [('ignore', None, <class 'DeprecationWarning'>, None, 0), ('ignore', None, <class 'PendingDeprecationWarning'>, None, 0), ('ignore', None, <class 'ImportWarning'>, None, 0), ('ignore', None, <class 'BytesWarning'>, None, 0), ('ignore', None, <class 'ResourceWarning'>, None, 0)]

-Wd on the release build adds a filter at the start:

$ ./release.python -Wd -c 'import pprint, warnings; pprint.pprint(warnings.filters)' [('default', None, <class 'Warning'>, None, 0), <~~~ HERE ('ignore', None, <class 'DeprecationWarning'>, None, 0), ('ignore', None, <class 'PendingDeprecationWarning'>, None, 0), ('ignore', None, <class 'ImportWarning'>, None, 0), ('ignore', None, <class 'BytesWarning'>, None, 0), ('ignore', None, <class 'ResourceWarning'>, None, 0)]

Debug build:

$ ./python -c 'import pprint, warnings; pprint.pprint(warnings.filters)' [('ignore', None, <class 'BytesWarning'>, None, 0), ('default', None, <class 'ResourceWarning'>, None, 0)]

-X dev adds a default filter at the end:

$ ./python -X dev -c 'import pprint, warnings; pprint.pprint(warnings.filters)' [('ignore', None, <class 'BytesWarning'>, None, 0), ('default', None, <class 'ResourceWarning'>, None, 0), ('default', None, <class 'Warning'>, None, 0)] <~~~ HERE

Note: you can combine -X dev with -W if you want ;-) (It works as expected.)

Victor



More information about the Python-Dev mailing list