Dennis Lee Bieber wrote: > On Mon, 23 Dec 2013 13:33:08 +1100, Steven D'Aprano > <steve+comp.lang.pyt...@pearwood.info> declaimed the following: > >>Roy Smith wrote: >> >> >>> else: >>> assert 0, "can't create picker (classes = %s)" % classes >> >>¡Ay, caramba! I was with you until the very last line. The above code is >>possibly buggy and inappropriately designed. (I may be completely >>misinterpreting this, in which case feel free to ignore the following >>rant.) >> > > I'd think the biggest problem with this is that if one runs Python with > optimization turned on, the assert statement itself vanishes, leaving one > with an empty else clause... > > Try debugging that problem!
Actually, that's not correct. If the assert statement vanishes, so does the else clause, since there's nothing in it. [steve@ando ~]$ python2.7 -c "from dis import dis > code = compile('''\ > for x in [1, 2, 3]: > pass > else: > assert x > ''', '', 'exec') > dis(code)""" 1 0 SETUP_LOOP 35 (to 38) 3 LOAD_CONST 0 (1) 6 LOAD_CONST 1 (2) 9 LOAD_CONST 2 (3) 12 BUILD_LIST 3 15 GET_ITER >> 16 FOR_ITER 6 (to 25) 19 STORE_NAME 0 (x) 2 22 JUMP_ABSOLUTE 16 >> 25 POP_BLOCK 4 26 LOAD_NAME 0 (x) 29 POP_JUMP_IF_TRUE 38 32 LOAD_GLOBAL 1 (AssertionError) 35 RAISE_VARARGS 1 >> 38 LOAD_CONST 3 (None) 41 RETURN_VALUE Compare to the case with optimizations on: [steve@ando ~]$ python2.7 -O -c "from dis import dis code = compile('''\ for x in [1, 2, 3]: pass else: assert x ''', '', 'exec') dis(code)""" 1 0 SETUP_LOOP 23 (to 26) 3 LOAD_CONST 0 (1) 6 LOAD_CONST 1 (2) 9 LOAD_CONST 2 (3) 12 BUILD_LIST 3 15 GET_ITER >> 16 FOR_ITER 6 (to 25) 19 STORE_NAME 0 (x) 2 22 JUMP_ABSOLUTE 16 >> 25 POP_BLOCK 4 >> 26 LOAD_CONST 3 (None) 29 RETURN_VALUE -- Steven -- https://mail.python.org/mailman/listinfo/python-list