Python 如何在一段代码中跟踪变量的使用?
我有一项特殊任务,需要跟踪任何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
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相关,那么我们需要跟踪它。