Assertions

Ned Batchelder ned at nedbatchelder.com
Thu Sep 21 12:59:25 EDT 2017


On 9/21/17 12:29 PM, Tobiah wrote:
> Are these completely equivalent?
>
> def foo(thing):
>
>          assert(thing > 0), "Thing must be greater than zero"
>
>
> def foo(thing):
>
>          if not (thing > 0): raise AssertionError("Thing must be greater than zero")
>
>
> Other than the fact that the assertion can be turned off
> with -O?
>

Let's see:

     Python 3.6.2 (default, Jul 17 2017, 07:05:09)
     [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
     Type "help", "copyright", "credits" or "license" for more information.
     >>> def foo1(thing):
     ...   assert(thing > 0), "Thing must be greater than zero"
     ...
     >>> def foo2(thing):
     ...   if not (thing > 0): raise AssertionError("Thing must be 
greater than zero")
     ...
     >>> import dis
     >>> dis.dis(foo1)
       2           0 LOAD_FAST                0 (thing)
                   2 LOAD_CONST               1 (0)
                   4 COMPARE_OP               4 (>)
                   6 POP_JUMP_IF_TRUE        16
                   8 LOAD_GLOBAL              0 (AssertionError)
                  10 LOAD_CONST               2 ('Thing must be greater 
than zero')
                  12 CALL_FUNCTION            1
                  14 RAISE_VARARGS            1
             >>   16 LOAD_CONST               0 (None)
                  18 RETURN_VALUE
     >>> dis.dis(foo2)
       2           0 LOAD_FAST                0 (thing)
                   2 LOAD_CONST               1 (0)
                   4 COMPARE_OP               4 (>)
                   6 POP_JUMP_IF_TRUE        16
                   8 LOAD_GLOBAL              0 (AssertionError)
                  10 LOAD_CONST               2 ('Thing must be greater 
than zero')
                  12 CALL_FUNCTION            1
                  14 RAISE_VARARGS            1
             >>   16 LOAD_CONST               0 (None)
                  18 RETURN_VALUE
     >>>

Yes, they are completely equivalent, compiling to precisely the same 
bytecode.

--Ned.



More information about the Python-list mailing list