回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在同一线路上对同一函数进行多次调用时。故障排除时,是否可以使用回溯或sys库来识别当前正在执行的程序?你知道吗</p>
<p><em>编辑:请不要提供变通方法。我知道我需要知道的关于如何解决这个问题的所有知识。我想知道的是,是否有一种方法可以找到有关解析/执行状态的更精确的信息,而不仅仅是调用指令的行号。</em></p>
<p>举个例子:</p>
<pre><code>#!/usr/bin/python3
# coding: UTF-8
def fn(var):
import traceback
print(repr(traceback.extract_stack()[-2]))
return var+1
a = b = 4
print(fn(a)+fn(b))
</code></pre>
<p>在空闲状态下运行此命令将写入:</p>
<pre><code> RESTART: /.../python/framesummary.py
<FrameSummary file /.../python/framesummary.py, line 11 in <module>>
<FrameSummary file /.../python/framesummary.py, line 11 in <module>>
10
</code></pre>
<p>有没有办法知道<code>fn</code>函数内部当前是在执行<code>fn(a)</code>还是<code>fn(b)</code>?你知道吗</p>
<hr/>
<p>编辑2:</p>
<p>我添加了一个案例,表明不能使用调用命令</p>
<pre><code>#!/usr/bin/python3
# coding: UTF-8
def fn(var):
import traceback
stack = traceback.extract_stack()
print(repr(stack[-2]))
print("code = '"+stack[-2][-1]+"'")
import sys
calling_frame = sys._getframe(1)
print("lasti =", calling_frame.f_lasti)
print()
return var+1
a = b = 4
print("case = sum", fn(a)+fn(b), "\n")
for boole in False, True:
print("case =", boole, fn(a) if boole else fn(b), "\n")
</code></pre>
<p>将打印:</p>
<pre><code> RESTART: /.../python/framesummary cleaned.py
<FrameSummary file /.../python/framesummary cleaned.py, line 18 in <module>>
code = 'print("case = sum", fn(a)+fn(b), "\n")'
lasti = 34
<FrameSummary file /.../python/framesummary cleaned.py, line 18 in <module>>
code = 'print("case = sum", fn(a)+fn(b), "\n")'
lasti = 43
case = sum 10
<FrameSummary file /.../python/framesummary cleaned.py, line 20 in <module>>
code = 'print("case =", boole, fn(a) if boole else fn(b), "\n")'
lasti = 100
case = False 5
<FrameSummary file /.../python/framesummary cleaned.py, line 20 in <module>>
code = 'print("case =", boole, fn(a) if boole else fn(b), "\n")'
lasti = 88
case = True 5
</code></pre>
<p>最好是有一个调用的第一个字符的指示,或者一种重新编译代码的方法,以便获得与每个调用对应的lasti值。你知道吗</p>
<p>显然,分析结果表明lasti的值与位置相关,但到目前为止,我在执行程序之前还没有发现这种关系:</p>
<pre><code>lasti = 34 => (line, column) = (18, 33) (or pos=29 in unindented string⁽¹⁾)
lasti = 43 => (line, column) = (18, 39) (or pos=35 in unindented string⁽¹⁾)
lasti = 88 => (line, column) = (20, 40) (or pos=32 in unindented string⁽¹⁾)
lasti = 100 => (line, column) = (20, 60) (or pos=52 in unindented string⁽¹⁾)
</code></pre>
<p>(1)由堆栈[-2][-1]给出</p>