Perfect, thanks! On Sun, Jan 25, 2015 at 7:08 AM, Petr Viktorin <encu...@gmail.com> wrote:
> On Sun, Jan 25, 2015 at 12:55 PM, Neil Girdhar <mistersh...@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 >
_______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com