<div dir="ltr">Perfect, thanks!</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 25, 2015 at 7:08 AM, Petr Viktorin <span dir="ltr"><<a href="mailto:encukou@gmail.com" target="_blank">encukou@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Sun, Jan 25, 2015 at 12:55 PM, Neil Girdhar <<a href="mailto:mistersheik@gmail.com">mistersheik@gmail.com</a>> wrote:<br>
> How do I disassemble a generated comprehension?<br>
><br>
> For example, I am trying to debug the following:<br>
><br>
>>>> dis.dis('{**{} for x in [{1:2}]}')<br>
> 1 0 LOAD_CONST 0 (<code object <dictcomp> at<br>
> 0x10160b7c0, file "<dis>", line 1>)<br>
> 3 LOAD_CONST 1 ('<dictcomp>')<br>
> 6 MAKE_FUNCTION 0<br>
> 9 LOAD_CONST 2 (2)<br>
> 12 LOAD_CONST 3 (1)<br>
> 15 BUILD_MAP 1<br>
> 18 BUILD_LIST 1<br>
> 21 GET_ITER<br>
> 22 CALL_FUNCTION 1 (1 positional, 0 keyword pair)<br>
> 25 RETURN_VALUE<br>
><br>
> (This requires the new patch in issue 2292.)<br>
><br>
> The code here looks fine to me, so I need to look into the code object<br>
> <dictcomp>. How do I do that?<br>
<br>
</div></div>Put it in a function, then get it from the function's code's constants.<br>
I don't have the patch applied but it should work like this even for<br>
the new syntax:<br>
<br>
>>> import dis<br>
>>> def f(): return {{} for x in [{1:2}]}<br>
...<br>
>>> dis.dis(f)<br>
1 0 LOAD_CONST 1 (<code object <setcomp> at<br>
0x7ff2c0647420, file "<stdin>", line 1>)<br>
3 LOAD_CONST 2 ('f.<locals>.<setcomp>')<br>
6 MAKE_FUNCTION 0<br>
9 BUILD_MAP 1<br>
12 LOAD_CONST 3 (2)<br>
15 LOAD_CONST 4 (1)<br>
18 STORE_MAP<br>
19 BUILD_LIST 1<br>
22 GET_ITER<br>
23 CALL_FUNCTION 1 (1 positional, 0 keyword pair)<br>
26 RETURN_VALUE<br>
>>> f.__code__.co_consts[1] # from "LOAD_CONST 1"<br>
<code object <setcomp> at 0x7ff2c0647420, file "<stdin>", line 1><br>
>>> dis.dis(f.__code__.co_consts[1])<br>
1 0 BUILD_SET 0<br>
3 LOAD_FAST 0 (.0)<br>
>> 6 FOR_ITER 12 (to 21)<br>
9 STORE_FAST 1 (x)<br>
12 BUILD_MAP 0<br>
15 SET_ADD 2<br>
18 JUMP_ABSOLUTE 6<br>
>> 21 RETURN_VALUE<br>
</blockquote></div><br></div>