[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