On Fri, Apr 10, 2015 at 3:35 AM, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote: > It's not so much the undefined behaviour part that gets me. That's bad > enough. But the concept that having the compiler ignore what you write in > the source code because you've accidentally hit some undefined part of the > spec *is a feature* rather than a horrible, horrible design flaw that blows > my mind.
In Python, you can create an assert with a side effect. This is something you should never do, and the compiler is free to optimize that side effect out. Is that outright malicious? The only difference is that in Python, it's well-defined - you can *depend* on that code being optimized out under certain specific conditions, rather than it depending on the compiler. (At least, I think that's the case. Is it legal for a Python implementation to fully evaluate asserts and then simply not raise the exception?) Take this example: def spam(lst): assert lst[0] < lst[1] # carry on with the rest of the code If lst is a Python list, this is side-effect free. But what if it isn't? What if __getitem__ actually mutates the object? The assertion can be dropped, and the getitem calls not made. Is that a horrible, horrible design flaw in Python, or is it an ill-designed object that does things that programmers should be allowed to assume never happen? ChrisA -- https://mail.python.org/mailman/listinfo/python-list