[Python-Dev] Can Python implementations reject semantically invalid expressions?

Mark Dickinson dickinsm at gmail.com
Fri Jul 2 09:29:05 CEST 2010


On Fri, Jul 2, 2010 at 8:22 AM, Mark Dickinson <dickinsm at gmail.com> wrote:
> On Fri, Jul 2, 2010 at 7:55 AM, Craig Citro <craigcitro at gmail.com> wrote:
>>
>>>>> dis.dis("raise TypeError()")
>>          0 <114>           26977
>>          3 <115>            8293
>>          6 IMPORT_STAR
>>          7 SETUP_EXCEPT    25968 (to 25978)
>>         10 <69>
>>         11 <114>           28530
>>         14 <114>           10536
>>>>> dis.dis("1 + '1'")
>>          0 <49>
>>          1 SLICE+2
>>          2 STORE_SLICE+3
>>          3 SLICE+2
>>          4 <39>
>>          5 <49>
>>          6 <39>
>
> Whoa.  That's very peculiar looking bytecode.  Is dis.dis behaving as
> it should here?

Ah.  I see.  It looks like the string "raise TypeError()" is being
interpreted *directly* as Python bytecode, with no intermediate
compilation.  I don't think this is what you intended.  Try:

>>> dis.dis(compile("raise TypeError", "", "exec"))
  1           0 LOAD_NAME                0 (TypeError)
              3 RAISE_VARARGS            1
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE
>>> dis.dis(compile("1 + '1'", "", "exec"))
  1           0 LOAD_CONST               0 (1)
              3 LOAD_CONST               1 ('1')
              6 BINARY_ADD
              7 POP_TOP
              8 LOAD_CONST               2 (None)
             11 RETURN_VALUE


Mark


More information about the Python-Dev mailing list