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

Python 如何在一段代码中跟踪变量的使用?,python,Python,我有一项特殊任务,需要跟踪任何python代码中任意变量的使用情况。我需要递归地在树结构中获取以下信息: 哪些函数正在使用此变量 哪些变量引用此变量或作为此变量的副本 函数调用1中的函数,变量引用2中的变量 例如,在以下代码段中: a=1 b=a def funA(a): print(a) def funB(): funA(a) def funC(): print(b) 全局变量a使用的跟踪记录为: a------b | | | |---pr

我有一项特殊任务,需要跟踪任何python代码中任意变量的使用情况。我需要递归地在树结构中获取以下信息:

  • 哪些函数正在使用此变量
  • 哪些变量引用此变量或作为此变量的副本
  • 函数调用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
    

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

    简短的回答:你不能

    长句回答:你可以,但你必须写一些看起来很像编译器的东西。您可以“仅仅”为python编写一个解析器,并对符号在哪个范围内用于计算哪些其他符号进行一些静态分析。然而,正如其他人提到的,如果必须完成分析,python的动态特性将是令人头疼的问题。无论程序多么聪明,您都会遇到静态分析根本做不到的情况


    一般来说,您可能需要做大量的工作才能使某些东西发挥作用,甚至需要做更多的工作来涵盖python的所有不同的聪明用法,这些用法可能会导致您的程序在最好的情况下出错,在最坏的情况下产生微妙的错误输出。没有什么比bug更糟糕的了,那不是bug,在编译器中,那不是编译器。

    如果
    funA
    的参数被称为
    c
    ,会发生什么?在这种情况下,您可以使用另一个“变量”来跟踪示例中的问题,即python不会像其他语言那样复制变量sam,a=b使其指向a使用的相同内存空间,因此,对于python来说,它们是相同的变量。您是在执行过程中尝试跟踪这一点,还是只想通读所有模块并从静态代码构建树?软件建议在这里是无关紧要的,但需要问自己的一个重要问题是,您是否想静态地执行此操作,而不运行python代码,或者在代码运行时动态执行。Python中的静态分析,特别是非类型化Python,由于其动态特性,非常困难。另一方面,动态分析只会显示执行的代码路径。如果您有良好的测试覆盖率,可以帮助您运行测试,那么您的大部分代码都将运行,并且可以进行分析。@DeepSpace,谢谢您的回复。当传递参数时,如果变量已经被跟踪,我需要继续跟踪它。在您的例子中,如果正在调用funA,并且正在传递的值与变量a相关,那么我们需要跟踪它。