I can understand the desire for correctness.  I do have to wonder though: has anyone *other* than language implementors noticed this issue with SyntaxErrors not being reported?

Perhaps we should remember "Practicality beats purity"?

--Ned.

On 7/5/19 6:14 PM, Pablo Galindo Salgado wrote:
> Until a solution which makes everyone happy can be found, I suggest to
move back to the status quo: revert the change.

>More people seems to expect "if 0: ..." to be removed, than people who
care of syntax errors on "if 0".

I don't think this is that clear. As Paul wrote on the issue this is the  result of fixing a bug that has been open since 2008 (11 years), which itself was noticed independently, also in 2008 (#1875 and #1920, respectively). He also independently discovered the same issue last year when writing some tests for IPython.

https://bugs.python.org/msg347394

On Fri, 5 Jul 2019 at 23:10, Victor Stinner <vstin...@redhat.com <mailto:vstin...@redhat.com>> wrote:

    Hi,

    Until a solution which makes everyone happy can be found, I suggest to
    move back to the status quo: revert the change.

    More people seems to expect "if 0: ..." to be removed, than people who
    care of syntax errors on "if 0".

    --

    Would it be possible to detect if the "if 0" block would raise a
    syntax error, and only remove it if it doesn't raise a syntax error?

    That's the approach I chose in my fatoptimizer project which is
    implemented as an AST optimizer:
    
https://github.com/vstinner/fatoptimizer/blob/master/fatoptimizer/dead_code.py

    See the tests to see which cases are *not* optimized:
    
https://github.com/vstinner/fatoptimizer/blob/master/test_fatoptimizer.py#L2428

    Some examples (the "dead code elimitaiton" is not only about "if 0",
    but also "while 0", dead code after return, etc.):

        self.check_dont_optimize("""
            def func():
                if 0:
                    yield
        """)

        self.check_dont_optimize("while 1: x = 1")

        self.check_dont_optimize("""
            def func(obj):
                return
                if 0:
                    yield from obj
        """)

        self.check_dont_optimize("""
            try:
                pass
            except Exception:
                yield 3
        """)

    See also the doc:
    https://fatoptimizer.readthedocs.io/en/latest/optimizations.html#dead-code

    --

    About code coverage, it seems like -X noopt would help:
    https://github.com/python/cpython/pull/13600

    But I'm not sure anymore after Ned Batchelder wrote:

    "The real-word implications from my world are this: if your code has
    "if 0:" clauses in it, and you measure its coverage, then because the
    lines have not been optimized away, coverage.py will think the lines
    are a possible execution path, and will be considered a miss because
    they are not executed.  This will reduce your coverage percentage."
    https://bugs.python.org/issue37500#msg347362

    Does it mean that coverage.py will report even more "false positive"
    using -X noopt?

    Victor


_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/LWZPZQ2IL67DPX3RC342TTOVCLKDSBTJ/
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/4VORK4Q2BNHN6SQUU423TODCXCWN77NT/

Reply via email to