python - 如何在一段代码中跟踪变量的使用?
问题描述
我有一个特殊的任务,需要我在任何一段 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巧妙用途,这会导致您的程序充其量会遇到错误并产生微妙的错误输出最坏的。没有什么比错误更糟糕的了,那不是错误,在编译器中,那不是编译器。
推荐阅读
- google-cloud-platform - 将文件从 GCP 存储桶发送到第 3 方 pdf 转换器
- c# - 人们使用 get 属性的原因是什么?放; 而不是字段?
- python - 我们可以在 REST API 上设置条件吗
- security - 了解由未定义行为清理程序 (UBSan) 触发的运行时错误
- sorting - 标准的非字母数字排序顺序
- flutter - 如何在flutter-stripe插件中启用邮政编码输入文本框?
- asp.net-core - How to add different CSS files to different layouts in blazor?
- excel - 确定两个数字的最大值
- javascript - nodemon反复重启
- apache-kafka - json列作为kafka生产者的key,根据key推送到不同的partition