如何在一段代码中跟踪变量的使用?

时间:2019-03-29 14:14:51

标签: python

我有一个特殊的任务,要求我跟踪任意python代码中任意变量的使用。我需要以树形结构递归获取以下信息:

  1. 哪些函数正在使用此变量。
  2. 哪些变量引用或作为此变量的副本。
  3. 在1中调用函数的函数和在2中引用变量的变量。

例如,在下面的代码中:

a=1

b=a

def funA(a):
    print(a)

def funB():
    funA(a)

def funC():
    print(b)

使用全局变量a的跟踪记录为:

a------b
   |   |
   |   |---print
   |         |
   |         |---funC
   |
   |---print
        |
        |---funA
              |
              |---funB

我想知道是否存在可以用于此任务的现有工具。如果没有这样的工具,那么我应该首先学习什么背景知识来构建这样的工具。谢谢。

1 个答案:

答案 0 :(得分:3)

简短的回答:您不能。

长答案:可以,但是您将不得不写一些看起来很像编译器的东西。您可能会“仅仅”为python编写一个解析器,并对在何处使用符号在哪些范围内用于计算其他符号进行静态分析。但是,正如其他人提到的那样,如果必须进行完整的分析,则python的动态性质将是造成严重头痛的原因。无论程序多么聪明,您都会遇到静态分析根本无法完成的情况。

通常,您可以期望很多工作可以使某件事完全起作用,甚至可以完成更多工作来涵盖某人可能在某处所做的所有不同的python聪明用法,从而导致您的程序充其量会产生错误并巧妙地产生最坏的输出错误。没有什么比错误更糟糕了,不是编译器中的错误,不是编译器。