[Python-Dev] Disassembly of generated comprehensions

Petr Viktorin encukou at gmail.com
Sun Jan 25 13:08:57 CET 2015


On Sun, Jan 25, 2015 at 12:55 PM, Neil Girdhar <mistersheik at gmail.com> wrote:
> How do I disassemble a generated comprehension?
>
> For example, I am trying to debug the following:
>
>>>> dis.dis('{**{} for x in [{1:2}]}')
>   1           0 LOAD_CONST               0 (<code object <dictcomp> at
> 0x10160b7c0, file "<dis>", line 1>)
>               3 LOAD_CONST               1 ('<dictcomp>')
>               6 MAKE_FUNCTION            0
>               9 LOAD_CONST               2 (2)
>              12 LOAD_CONST               3 (1)
>              15 BUILD_MAP                1
>              18 BUILD_LIST               1
>              21 GET_ITER
>              22 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
>              25 RETURN_VALUE
>
> (This requires the new patch in issue 2292.)
>
> The code here looks fine to me, so I need to look into the code object
> <dictcomp>.  How do I do that?

Put it in a function, then get it from the function's code's constants.
I don't have the patch applied but it should work like this even for
the new syntax:

>>> import dis
>>> def f(): return {{} for x in [{1:2}]}
...
>>> dis.dis(f)
  1           0 LOAD_CONST               1 (<code object <setcomp> at
0x7ff2c0647420, file "<stdin>", line 1>)
              3 LOAD_CONST               2 ('f.<locals>.<setcomp>')
              6 MAKE_FUNCTION            0
              9 BUILD_MAP                1
             12 LOAD_CONST               3 (2)
             15 LOAD_CONST               4 (1)
             18 STORE_MAP
             19 BUILD_LIST               1
             22 GET_ITER
             23 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             26 RETURN_VALUE
>>> f.__code__.co_consts[1]  # from "LOAD_CONST 1"
<code object <setcomp> at 0x7ff2c0647420, file "<stdin>", line 1>
>>> dis.dis(f.__code__.co_consts[1])
  1           0 BUILD_SET                0
              3 LOAD_FAST                0 (.0)
        >>    6 FOR_ITER                12 (to 21)
              9 STORE_FAST               1 (x)
             12 BUILD_MAP                0
             15 SET_ADD                  2
             18 JUMP_ABSOLUTE            6
        >>   21 RETURN_VALUE


More information about the Python-Dev mailing list