Javascript 为什么';eclipse python是否有神奇的重构?

Javascript 为什么';eclipse python是否有神奇的重构?,javascript,python,eclipse,refactoring,automated-refactoring,Javascript,Python,Eclipse,Refactoring,Automated Refactoring,Eclipse能够利用编译的字节码来启用“神奇的重构”功能——重命名方法、跟踪上下类层次结构以及通过方法调用进行跟踪 有哪些技术障碍使得Python和Javascript等语言更难做到这一点?因为动态绑定。Python是一种动态语言,您几乎可以用变量做任何事情。您甚至可以访问globals dict并引入由运行时值组成的新变量 因此,IDE无法确定何时存在哪些变量。请参见此示例: #silly.py import sys if len(sys.argv) > 1: thisNo

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-dully
)和排序的动态加载,它甚至可能在
import-sys
之前存在,而没有参数


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

因此,在python中跟踪静态信息(如方法和类层次结构)是完全可能的。pydeveclipse插件可以做到这一点。PyLint插件通过假设在运行时不会发生任何奇怪的事情来尝试对动态变量之类的东西进行静态分析,并且做得很好。

ctrl-H Find and replace确实有效,但您需要小心……PyDev甚至提供了一个“重命名此”命令,该命令不会杀死字符串等。但一般来说,静态代码分析只能提供关于动态语言中代码的有限知识。Eric4IDE包括使用Rope库()进行重构。我没有太广泛地使用它,但它似乎做得很好。我对跟踪方法和类层次结构更感兴趣,这会改变什么吗?你能解释一下你的评论是什么意思吗?我不是以英语为母语的人,我只是不明白,对不起。如果你能解释一下你到底是如何做到你所说的,那就太好了。否则,这个“自我”答案并不完整。例如,我很想知道,在我将python模块移到子包中之后,如何在我的项目中自动修复导入。这是java重构很容易做到的一件事,但对于python,我没有做到这一点。谢谢在2015年和PyDev 3.9.0.20141111中,这种重构能力仍然缺失(无论出于何种原因——本文的评论并不是关于这一点)。我发现最有效的替代品是find-命名'*.py'-exec sed-i's/search/replace/g',并且对我正在做的事情非常小心。