Assertions
Steve D'Aprano
steve+python at pearwood.info
Thu Sep 21 13:49:45 EDT 2017
On Fri, 22 Sep 2017 03:31 am, Chris Angelico wrote:
> On Fri, Sep 22, 2017 at 3:23 AM, Steve D'Aprano
> <steve+python at pearwood.info> wrote:
>> That is definitely version-dependent, because I've just tried it and got
>> different byte-code in Python 2.7.
>>
>> py> import dis
>> py> def test1():
>> ... assert foo, "bar baz"
>> ...
>> py> def test2():
>> ... if not foo: raise AssertionError("bar baz")
>> ...
>> py>
>> py> dis.dis(test1)
>> 2 0 LOAD_GLOBAL 0 (foo)
>> 3 POP_JUMP_IF_TRUE 15
>> 6 LOAD_GLOBAL 1 (AssertionError)
>> 9 LOAD_CONST 1 ('bar baz')
>> 12 RAISE_VARARGS 2
>> >> 15 LOAD_CONST 0 (None)
>> 18 RETURN_VALUE
>> py> dis.dis(test2)
>> 2 0 LOAD_GLOBAL 0 (foo)
>> 3 POP_JUMP_IF_TRUE 21
>> 6 LOAD_GLOBAL 1 (AssertionError)
>> 9 LOAD_CONST 1 ('bar baz')
>> 12 CALL_FUNCTION 1
>> 15 RAISE_VARARGS 1
>> 18 JUMP_FORWARD 0 (to 21)
>> >> 21 LOAD_CONST 0 (None)
>> 24 RETURN_VALUE
>
> Impressive. That means that, in 2.7, it's actually equivalent to:
>
>>>> def test3():
> ... if not foo: raise AssertionError, "bar baz"
That's nothing. In 1.5 (yes, *one* point five) it's equivalent to something more
or less like this:
def test4():
if __debug__:
if foo:
return
raise AssertionError('bar baz')
> Although in the 2.7 that I have, the assert statement does actually
> *call* AssertionError (ie it constructs an instance and raises it).
> What version are you running? Here's mine:
>
> $ python2
> Python 2.7.13 (default, Jan 19 2017, 14:48:08)
> [GCC 6.3.0 20170118] on linux2
Now that you've showed me yours, I suppose I have to show you mine.
Python 2.7.2 (default, May 18 2012, 18:25:10)
So definitely version dependent.
--
Steve
“Cheer up,” they said, “things could be worse.” So I cheered up, and sure
enough, things got worse.
More information about the Python-list
mailing list