Eclipse 能够利用编译后的字节码来启用“魔术重构”功能——重命名方法、向上和向下跟踪类层次结构以及通过方法调用进行跟踪。
存在哪些技术障碍使 Python 和 Javascript 等语言更难做到这一点?
Eclipse 能够利用编译后的字节码来启用“魔术重构”功能——重命名方法、向上和向下跟踪类层次结构以及通过方法调用进行跟踪。
存在哪些技术障碍使 Python 和 Javascript 等语言更难做到这一点?
因为动态绑定。Python 是一种动态语言,您几乎可以使用变量完成所有操作。您甚至可以访问 globals-dict 并引入由运行时值组成的新变量。
因此 IDE 无法确定何时存在哪些变量。看这个例子:
#silly.py
import sys
if len(sys.argv) > 1:
thisNowExists = True
#1
try:
if thisNowExists:
print("this existed before")
except NameError:
print("this _now_ exists")
thisNowExists = True
没有人或 IDE 可以知道thisNowExists
该位置是否已定义#1
,因此如果您想重命名该位置thisNowExists
下方的愚蠢名称,是否也应该重命名之前的外观是未定义的#1
。
您必须进行高级控制流分析才能很好地猜测thisNowExists
在 try/catch 语句下方定义的猜测,但由于脚本 ( thisNowExists = 1; import silly
) 和排序的动态加载,它甚至可以在import sys
没有参数的情况下存在。
以不同的方式命名变量并查找/替换是您的最佳选择;)
所以事实证明,在 python 中跟踪静态信息(如方法和类层次结构)是完全可能的。PyDev eclipse 插件做到了。PyLint 插件试图通过假设在运行时没有任何奇怪的事情发生并且做得很好,甚至对动态变量之类的东西进行静态分析。