有没有办法得到Python程序的跟踪表?或者让一个程序运行另一个程序并得到它的跟踪表?我是一名教师,试图完美地验证我们在测试中使用的跟踪问题的答案。
因此,例如,假设我有一个名为problem1.py
的Python程序,其内容如下:
a = 1
b = 2
a = a + b
执行假定的程序traceTable.py
应该如下:
$ python traceTable.py problem1.py
L || a | b
1 || 1 |
2 || 1 | 2
4 || 3 | 2
(或使用不同语法的相同信息)
我已经研究了trace
模块,但我看不出它支持这个功能的方式。
女士们先生们:利用内德·巴切尔德的绝妙建议,我给你们traceTable.py
!
嗯。。几乎。正如您在Ned Batchelder的例子中所看到的,frame.f_lineno
并不总是表现得很直观(例如,两行3&4都算作第4行),但是行号足够接近,可以进行相当好的引用。而且,所有的计算都是正确的。
我用一个包含if
语句的长程序对此进行了测试,它给出了正确的表(没有行号)。
你也会注意到我的程序比Ned Batchelder的概念证明要长得多,因为他提到的大型程序中包含了“更有趣的数据生态系统”。在使用execfile
以及管理它和减少噪声(alaignored_variables
)以及生成正确字符串输出所需的所有变量的范围内,需要更多的代码:
'''
Usage: python traceTable.py program
-program Python program to be traced
'''
import sys
if len(sys.argv) < 2:
print __doc__
exit()
else:
file_name = sys.argv[1]
past_locals = {}
variable_list = []
table_content = ""
ignored_variables = set([
'file_name',
'trace',
'sys',
'past_locals',
'variable_list',
'table_content',
'getattr',
'name',
'self',
'object',
'consumed',
'data',
'ignored_variables'])
def trace(frame, event, arg_unused):
global past_locals, variable_list, table_content, ignored_variables
relevant_locals = {}
all_locals = frame.f_locals.copy()
for k,v in all_locals.items():
if not k.startswith("__") and k not in ignored_variables:
relevant_locals[k] = v
if len(relevant_locals) > 0 and past_locals != relevant_locals:
for i in relevant_locals:
if i not in past_locals:
variable_list.append(i)
table_content += str(frame.f_lineno) + " || "
for variable in variable_list:
table_content += str(relevant_locals[variable]) + " | "
table_content = table_content[:-2]
table_content += '\n'
past_locals = relevant_locals
return trace
sys.settrace(trace)
execfile(file_name)
table_header = "L || "
for variable in variable_list:
table_header += variable + ' | '
table_header = table_header[:-2]
print table_header
print table_content
当被调用时,它会产生输出
$ python traceTable.py problem1.py
L || a | b
2 || 1
4 || 1 | 2
4 || 3 | 2
这不是当前Python跟踪工具支持的用例,但是应该可以构建。我不知道你如何决定输出哪些列。在您的示例中,a和b是唯一的局部变量,但是较大的程序将具有更有趣的数据生态系统。
更新:这里有一个简单的概念证明:
运行时,输出为:
根据ned batchelder的建议,作为一名教师,我制作了一个
Tracer
类,帮助创建LaTeX
输出longtable
显示带有选择变量的程序跟踪,绕过input()
以实现过程自动化(特别是当由powerfull bashfulLaTeX
包中的\bash
宏调用时)。追踪.py:
接下来,您可以找到一个示例,并生成输出:
程序.py:
标准输出:(由
python3 program.py
调用时)跟踪输出:(由
python3 program.py trace 1>/dev/null
调用时)值更改时插入
\hit{}
宏。由您定义一些相关的内容,如着色宏:\newcommand{\hit}{\color{red}}
您可以使用Python debugger,虽然我不知道如何让它自己单步执行,但它很可能可以,然后您可以解析输出。
下面是一个非常粗糙的例子:
添加.py
运行它。。。
结束(q)在“程序完成”位。
相关问题 更多 >
编程相关推荐