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
thisNowExists
が の位置で定義されているかどうかは、人間も IDE も知ることができないため、その位置より下にある#1
愚かな名前の名前を変更したい場合thisNowExists
、外観の名前も の前#1
に変更する必要があるかどうかは未定義です。
try/catch ステートメントの下に定義されている適切な推測を行うには、高度な制御フロー分析を行う必要がありますが、スクリプト ( ) と並べ替えthisNowExists
の動的な読み込みにより、引数なしで前に存在することさえあります。thisNowExists = 1; import silly
import sys
変数に別の名前を付けて、検索/置換が最良のオプションです;)
したがって、メソッドやクラス階層などの静的情報のトレースは、Python で完全に可能であることがわかります。PyDev Eclipse プラグインがそれを行います。PyLint プラグインは、動的変数のようなものに対しても静的分析を実行しようとします。これは、実行時に異常が発生せず、非常にうまく機能すると想定することによって行われます。