[Python-Dev] Disassembly of generated comprehensions

Neil Girdhar mistersheik at gmail.com
Sun Jan 25 13:12:02 CET 2015


Perfect, thanks!

On Sun, Jan 25, 2015 at 7:08 AM, Petr Viktorin <encukou at gmail.com> wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20150125/7e17c44c/attachment.html>


More information about the Python-Dev mailing list