为什么eclipse-python没有魔法重构?
Eclipse可以利用已经编译好的字节码来实现一种叫做“魔法重构”的功能——这意味着它可以轻松地重命名方法,追踪类之间的关系,以及跟踪方法的调用过程。
那么,对于像Python和JavaScript这样的语言,为什么实现起来会更困难呢?
2 个回答
6
这是因为动态绑定。Python是一种动态语言,这意味着你几乎可以对变量做任何事情。你甚至可以访问全局字典,并根据运行时的值引入新变量。
所以,一个集成开发环境(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能知道在位置#1
时thisNowExists
是否已经定义。因此,如果你想在这个位置下面重命名这个名字很傻的thisNowExists
,那么在#1
之前是否也要重命名就变得不确定了。
你需要进行复杂的控制流分析,才能大致猜测thisNowExists
是在try/catch语句下面定义的,但由于脚本的动态加载(thisNowExists = 1; import silly
)等原因,它甚至可能在没有参数的情况下出现在import sys
之前。
给你的变量起不同的名字,然后使用查找和替换是你最好的选择;)
1
原来在Python中,追踪一些静态信息,比如方法和类的层级结构,是完全可行的。PyDev这个Eclipse插件就能做到这一点。而PyLint插件则尝试对一些动态变量进行静态分析,它假设在运行时不会发生什么奇怪的事情,结果做得也相当不错。