4

Eclipse 能够利用编译后的字节码来启用“魔术重构”功能——重命名方法、向上和向下跟踪类层次结构以及通过方法调用进行跟踪。

存在哪些技术障碍使 Python 和 Javascript 等语言更难做到这一点?

4

2 回答 2

6

因为动态绑定。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没有参数的情况下存在。

以不同的方式命名变量并查找/替换是您的最佳选择;)

于 2011-02-14T19:04:27.547 回答
1

所以事实证明,在 python 中跟踪静态信息(如方法和类层次结构)是完全可能的。PyDev eclipse 插件做到了。PyLint 插件试图通过假设在运行时没有任何奇怪的事情发生并且做得很好,甚至对动态变量之类的东西进行静态分析。

于 2011-03-18T22:57:07.630 回答