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

Nathaniel Smith njs at pobox.com
Mon Nov 13 20:38:39 EST 2017


On Mon, Nov 13, 2017 at 6:09 AM, Serhiy Storchaka <storchaka at gmail.com> wrote:

13.11.17 14:29, Antoine Pitrou пише:

On Mon, 13 Nov 2017 22:37:46 +1100 Chris Angelico <rosuav at gmail.com> wrote:

On Mon, Nov 13, 2017 at 9:46 PM, Antoine Pitrou <solipsis at pitrou.net> wrote:

On Sun, 12 Nov 2017 19:48:28 -0800 Nathaniel Smith <njs at pobox.com> wrote:

On Sun, Nov 12, 2017 at 1:24 AM, Nick Coghlan <ncoghlan at gmail.com> wrote:

This change will lead to DeprecationWarning being displayed by default for: * code executed directly at the interactive prompt * code executed directly as part of a single-file script

Technically it's orthogonal, but if you're trying to get better warnings in the REPL, then you might also want to look at: https://bugs.python.org/issue1539925 https://github.com/ipython/ipython/issues/6611 Depends what you call "better". Personally, I don't want to see warnings each and every time I use a deprecated or questionable construct or API from the REPL. Isn't that the entire point of warnings? When you're working at the REPL, you're the one in control of which APIs you use, so you should be the one to know about deprecations. If I see a warning once every REPL session, I know about the deprecation already, thank you. I don't need to be taken by the hand like a little child. Besides, the code I write in the REPL is not meant for durable use. Hmm, now I see that the simple Nathaniel's solution is not completely correct. If the warning action is 'module', it should be emitted only once if used directly in the REPL, because 'main' is the same module.

True. The fundamental problem is that generally, Python uses (filename, lineno) pairs to identify lines of code. But (a) the warning module assumes that for each namespace dict, there is a unique mapping between line numbers and lines of code, so it ignores filename and just keys off lineno, and (b) the REPL re-uses the same (file, lineno) for different lines of code anyway.

So I guess the fully correct solution would be to use a unique "filename" when compiling each block of code -- e.g. the REPL could do the equivalent of compile(, "REPL[1]", ...) for the first line, compile(, "REPL[2]", ...) for the second line, etc. -- and then also teach the warnings module's duplicate detection logic to key off of (file, lineno) pairs instead of just lineno.

-n

-- Nathaniel J. Smith -- https://vorpus.org



More information about the Python-Dev mailing list