在 Python 程序中记录每个变量赋值的类型的最佳方法是啥?
Posted
技术标签:
【中文标题】在 Python 程序中记录每个变量赋值的类型的最佳方法是啥?【英文标题】:What's the best way to record the type of every variable assignment in a Python program?在 Python 程序中记录每个变量赋值的类型的最佳方法是什么? 【发布时间】:2009-05-05 02:52:08 【问题描述】:Python 是如此动态,以至于在大型程序中发生的事情并不总是很清楚,而且查看一小部分源代码并不总是有帮助。更糟糕的是,编辑器往往对导航到 Python 文件中的标记定义或导入语句的支持很差。
一种补偿方法可能是编写一个特殊的分析器,而不是为程序计时,它会记录程序对象的运行时类型和路径,并将这些数据公开给编辑器。
这可以通过 sys.settrace() 来实现,它为每一行代码设置一个回调,并且是 pdb 的实现方式,或者通过使用 ast 模块和导入钩子来检测代码,或者有更好的策略?你如何写这样的东西而不让它变得非常慢,并且不会与极端的活力发生冲突,例如对财产访问的副作用?
【问题讨论】:
将“大”程序分解成更小的函数和类定义以便查看一小部分源代码有什么帮助?分解和重构有什么问题?为什么这些技术不起作用? 我正在开发的系统不是“几个星期来重构”的大。这是“几年重构”的大。我没有那种时间。 【参考方案1】:我认为你不能让它变慢,但是当你遇到 STORE_FAST STORE_NAME STORE_* 操作码时应该可以检测到每个变量的地址。
以前有没有做过,我不知道。
如果您需要调试,请查看PDB,这将允许您逐步执行代码并访问任何变量。
import pdb
def test():
print 1
pdb.set_trace() # you will enter an interpreter here
print 2
【讨论】:
【参考方案2】:如果您对object
的类或其他原型对象进行猴子修补怎么办?
如果您不使用新式类,这可能不是最简单的。
【讨论】:
【参考方案3】:您可能想查看PyChecker 的代码 - 它确实(我认为)您想要做的事情。
【讨论】:
【参考方案4】:Pythoscope 所做的事情与您所描述的非常相似,它使用 AST 形式的静态信息和通过 sys.settrace
的动态信息的组合。
顺便说一句,如果您在重构项目时遇到问题,请尝试使用 Pythoscope。
【讨论】:
以上是关于在 Python 程序中记录每个变量赋值的类型的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章