<div dir="auto"><div class="gmail_extra" dir="auto">Let's discuss -Xdev implementation issue at <a href="https://bugs.python.org/issue32230">https://bugs.python.org/issue32230</a></div><div class="gmail_extra" dir="auto"><br></div><div class="gmail_extra" dir="auto">In short, -Xdev must add its warning at the end to respect BytesWarning, whereas it's not possible with -W option :-(</div><div class="gmail_extra" dir="auto"><br></div><div class="gmail_extra" dir="auto">Victor</div><div class="gmail_extra" dir="auto"><br><div class="gmail_quote" dir="auto">Le 6 déc. 2017 09:15, "Nick Coghlan" <<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>> a écrit :<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="quoted-text">On 6 December 2017 at 14:50, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>> wrote:<br>
> On 6 December 2017 at 14:34, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>> wrote:<br>
>> That said, I go agree we could offer easier to use APIs to app<br>
>> developers that just want to hide warnings from their users, so I've<br>
>> filed <a href="https://bugs.python.org/issue32229" rel="noreferrer" target="_blank">https://bugs.python.org/<wbr>issue32229</a> to propose a straightforward<br>
>> "warnings.hide_warnings()" API that encapsulates things like checking<br>
>> for a non-empty sys.warnoptions list.<br>
><br>
> I've updated the "Limitations" section of the PEP to mention that<br>
> separate proposal:<br>
> <a href="https://github.com/python/peps/commit/6e93c8d2e6ad698834578d4077b92a8fc84a70f5" rel="noreferrer" target="_blank">https://github.com/python/<wbr>peps/commit/<wbr>6e93c8d2e6ad698834578d4077b92a<wbr>8fc84a70f5</a><br>
<br>
</div>Having rebased the PEP 565 patch atop the "-X dev" changes, I think<br>
that if we don't change some of the details of how `-X dev` is<br>
implemented, `warnings.hide_warnings` (or a comparable convenience<br>
API) is going to be a requirement to help app developers effectively<br>
manage their default warnings settings in 3.7+.<br>
<br>
The problem is that devmode doesn't currently behave the same way<br>
`-Wd` does when it comes to sys.warnoptions:<br>
<br>
    $ ./python -Wd -c "import sys; print(sys.warnoptions);<br>
print(sys.flags.dev_mode)"<br>
    ['d']<br>
    False<br>
    $ ./python -X dev -c "import sys; print(sys.warnoptions);<br>
print(sys.flags.dev_mode)"<br>
    []<br>
    True<br>
<br>
As currently implemented, the warnings module actually checks<br>
`sys.flags.dev_mode` directly during startup (or `sys._xoptions` in<br>
the case of the pure Python fallback), and populates the warnings<br>
filter differently depending on what it finds:<br>
<br>
    $ ./python -c "import warnings; print('\n'.join(map(str,<br>
warnings.filters)))"<br>
    ('default', None, <class 'DeprecationWarning'>, '__main__', 0)<br>
<div class="quoted-text">    ('ignore', None, <class 'DeprecationWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'PendingDeprecationWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'ImportWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'BytesWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'ResourceWarning'>, None, 0)<br>
<br>
</div>    $ ./python -X dev -c "import warnings; print('\n'.join(map(str,<br>
warnings.filters)))"<br>
<div class="quoted-text">    ('ignore', None, <class 'BytesWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('default', None, <class 'ResourceWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('default', None, <class 'Warning'>, None, 0)<br>
<br>
</div>    $ ./python -Wd -c "import warnings; print('\n'.join(map(str,<br>
warnings.filters)))"<br>
<div class="quoted-text">    ('default', None, <class 'Warning'>, None, 0)<br>
</div>    ('default', None, <class 'DeprecationWarning'>, '__main__', 0)<br>
<div class="quoted-text">    ('ignore', None, <class 'DeprecationWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'PendingDeprecationWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'ImportWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'BytesWarning'>, None, 0)<br>
</div><div class="quoted-text">    ('ignore', None, <class 'ResourceWarning'>, None, 0)<br>
<br>
</div>This means the app development snippet proposed in the PEP will no<br>
longer do the right thing, since it will ignore the dev mode flag:<br>
<br>
    if not sys.warnoptions:<br>
        # This still runs for `-X dev`<br>
        warnings.simplefilter("ignore"<wbr>)<br>
<br>
My main suggested fix would be to adjust the way `-X dev` is<br>
implemented to include `sys.warnoptions.append('<wbr>default')` (and remove<br>
the direct dev_mode query from the warnings module code).<br>
<br>
However, another possible way to go would be to make the correct<br>
Python 3.7+-only snippet look like this:<br>
<br>
    import warnings<br>
    warnings.hide_warnings()<br>
<br>
And have the forward-compatible snippet look like this:<br>
<br>
    import warnings:<br>
    if hasattr(warnings, "hide_warnings"):<br>
        # Accounts for `-W`, `-X dev`, and any other implementation<br>
specific settings<br>
        warnings.hide_warnings()<br>
    else:<br>
        # Only accounts for `-W`<br>
        import sys<br>
<div class="quoted-text">        if not sys.warnoptions:<br>
            warnings.simplefilter("ignore"<wbr>)<br>
<br>
</div>(We can also do both, of course)<br>
<div class="elided-text"><br>
Cheers,<br>
Nick.<br>
<br>
--<br>
Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>   |   Brisbane, Australia<br>
</div></blockquote></div><br><br></div></div>