On Mon, Nov 13, 2017 at 6:09 AM, Serhiy Storchaka
13.11.17 14:29, Antoine Pitrou пише:
On Mon, 13 Nov 2017 22:37:46 +1100 Chris Angelico
wrote: On Mon, Nov 13, 2017 at 9:46 PM, Antoine Pitrou
wrote: On Sun, 12 Nov 2017 19:48:28 -0800 Nathaniel Smith
wrote: On Sun, Nov 12, 2017 at 1:24 AM, Nick Coghlan
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(<code>, "REPL[1]", ...) for the first line, compile(<code>, "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