[Python-Dev] PEP 565: Show DeprecationWarning in __main__

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(<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.


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

More information about the Python-Dev mailing list