擅长:python、mysql、java
<p>不幸的是,编译后的字节码丢失了列偏移量;字节码索引到行号的映射包含在<code>co_lnotab</code>行号表中。<code>dis</code>模块是查看字节码并解释<code>co_lnotab</code>的好方法:</p>
<pre><code>>>> dis.dis(compile('a, b, c', '', 'eval'))
1 0 LOAD_NAME 0 (a)
3 LOAD_NAME 1 (b)
6 LOAD_NAME 2 (c)
9 BUILD_TUPLE 3
12 RETURN_VALUE
^-- line number
</code></pre>
<p>但是,没有什么能阻止我们搞乱行号:</p>
^{pr2}$
<p>由于直接编译代码<em>应该</em>与通过<code>ast.parse</code>编译相同,并且由于弄乱行号<em>不应该</em>影响生成的字节码(除了<code>co_lnotab</code>),您应该能够:</p>
<ul>
<li>找到源文件</li>
<li>用<code>ast.parse</code>解析它</li>
<li>munge ast中的行号以包括列偏移量</li>
<li>编译ast</li>
<li>使用<code>tb_lasti</code>搜索munged <code>co_lnotab</code></li>
<li>将蒙版行号转换回(行号,列偏移量)</li>
</ul>