在取得了最初的成功之后sys.settrace()
,我最终切换到了ast
模块(抽象语法树)。我解析要分析的代码,然后在每次分配后插入新的调用,以报告变量名称及其新值。我还插入调用以报告循环迭代和函数调用。然后我执行修改后的树。
tree = parse(source)
visitor = TraceAssignments()
new_tree = visitor.visit(tree)
fix_missing_locations(new_tree)
code = compile(new_tree, PSEUDO_FILENAME, 'exec')
self.environment[CONTEXT_NAME] = builder
exec code in self.environment
我正在使用像Bret Victor’s这样的实时编码工具,并且您可以在GitHub上查看我的工作代码,以及有关其在测试中的行为的一些示例。您还可以从项目页面上找到演示视频,教程和下载的链接。