Visual Studio で Python コードをリファクターする

既存のコードの再利用とコードの更新は、開発者の一般的なタスクです。 既存のコードを別の目的でリファクターし、コードをすべて新しく記述しないことで時間を節約することもできます。 コードをクリーンして未使用の項目を削除したり、インポートやメソッドを最新のバージョンに更新したりできます。

Visual Studio には、Python ソース コードの変換とクリーンを自動的に実行するためのいくつかのコマンドが用意されています。

前提条件

  • 見ることができます。 製品をインストールするには、「Visual Studio のインストール」の手順に従います。
  • 既存のコードを使用して Python コード プロジェクトにアクセスします。

クラス、メソッド、または変数の名前を変更する

[名前の変更] コマンドを使用すると、クラス、メソッド、変数など、特定の識別子の名前を変更できます。 Visual Studio では、識別子のすべてのインスタンス、または指定した特定のインスタンスのみを更新できます。

次の手順では、コードで [名前の変更] コマンドの使用方法を説明します。

  1. コードで名前を変更する識別子を右クリックし、[名前の変更] を選択します。 識別子にキャレットを配置して、メニューから [編集]>[リファクター]>[名前の変更] の順に選択するか、キーボード ショートカット F2 を使用することもできます。

  2. [名前の変更] ダイアログで、識別子の新しい名前を入力し、[OK] を選択します。

    Screenshot that shows how to specify a different name for an identifier in Visual Studio 2019.

  3. 次のダイアログで、新しい名前を使用する必要があるコード内のファイルとインスタンスを選択します。 個々のインスタンスを選択すると、特定の変更をプレビューできます。

    Screenshot that shows how to apply the new name to specific instances of an identifier and preview the changes in Visual Studio 2019.

  4. [適用] を選択して、ソース コード ファイルを変更します。

  1. コードで名前を変更する識別子を右クリックし、[名前の変更] を選択します。 識別子にキャレットを配置して、メニューから [編集]>[リファクター]>[名前の変更] の順に選択するか、キーボード ショートカット Ctrl+R を使用することもできます。

  2. [名前の変更] ダイアログに識別子の新しい名前を入力し、Enter を押します。

    Screenshot that shows how to specify a different name for an identifier in Visual Studio 2022.

import ステートメントの追加

定義またはサポートされている型情報が指定されていない識別子がコードにある場合は、Visual Studio が問題の修正に役立ちます。 情報が指定されていない識別子にキャレットを配置すると、Visual Studio ではコードの左側にスマート タグ (電球) が表示されます。 タグには、対応する識別子に必要な import または from ... import ステートメントを追加するコマンドが一覧表示されます。

次の手順では、スマート タグを使用してコードにインポートを追加する方法を説明します。

  1. コードに、Visual Studio でスマート タグ (電球) が表示される識別子にキャレットを配置します。 この例では、math モジュールの呼び出しに対してスマート タグが表示されています。

    Screenshot that shows the smart tag for an identifier that needs an import statement added in Visual Studio 2019.

    Screenshot that shows the smart tag for an identifier that needs an import statement added in Visual Studio 2022.

  2. スマート タグ メニューでコマンドを選択して、必要なモジュールまたは型情報をコード ファイルに追加します。 この例では、import math ステートメントを追加するコマンドが選択されています。

    Visual Studio では、現在のパッケージの最上位のパッケージとモジュール、および標準ライブラリについて import の入力候補を表示できます。 Visual Studio では、サブモジュール、サブパッケージ、およびモジュール メンバーについて from ... import の入力候補も表示されます。 入力候補には、関数、クラス、またはエクスポートされたデータが含まれます。

  3. オプションを選択した後、必要な変更がファイルに加えられているかどうかを確認します。

    Visual Studio では、他のインポート後に import ステートメントをコード ファイルの上部に追加するか、同じモジュールが既にインポートされている場合は既存の from ... import ステートメント内に追加します。 この例では、import math ステートメントが他のインポート後にファイルの上部に追加されています。

    Screenshot that shows the import statement added after running the command from the smart tag in Visual Studio 2019.

    Screenshot that shows the import statement added after running the command from the smart tag in Visual Studio 2022.

Visual Studio は、モジュールで定義されていないメンバーを除外しようとします。 たとえば、インポート モジュールの子ではない別のモジュールにインポートされるモジュールです。 多くのモジュールでは、from xyz import sys ではなくimport sys ステートメントが使用されます。 sys モジュールを除外する __all__ メンバーがモジュールにない場合でも、他のモジュールから sys モジュールをインポートするための入力候補は表示されません。

同様に、Visual Studio は他のモジュールまたは組み込みの名前空間からインポートされる関数を除外します。 モジュールが sys モジュールから settrace 関数をインポートする場合、理論的にはそのモジュールから関数をインポートすることもできます。 ただし、最適な方法は import settrace from sys ステートメントを直接使用することであるため、Visual Studio はそのステートメントを明確に提示します。

最後に、通常は除外されるモジュールに、モジュールの値で代入された名前のように含まれている他の値があるとします。 それでも、Visual Studio ではインポートが除外されます。 この動作は、その値が別のモジュールで定義されているため、エクスポートする必要がないことを想定しています。 別の代入は、同様にエクスポートされていないダミー値である可能性があります。

使用されていないインポートの削除

コードの作成では、モジュールの import ステートメントが最終的にまったく使われないことがよくあります。 Visual Studio はコードを分析するので、インポートされた名前が import ステートメントの出現箇所より後のスコープ内で使用されているかどうかを調べて、このステートメントが必要かどうかを自動的に判断できます。

次の手順では、コード内の使用されていないインポートを削除する方法を説明します。

  1. エディター内の任意の場所を右クリックし、[インポートの削除] を選択します。 インポートは、[すべてのスコープ] または [現在のスコープ] から削除できます。

    Screenshot that shows how to access the Remove Imports menu in Visual Studio 2019.

    Visual Studio は、使用されていないモジュールがコードにあるかどうかを判断し、対応する import ステートメントを削除します。

  2. オプションを選択した後、必要な変更がファイルに加えられているかどうかを確認します。 この例では、使用されていない 3 つのモジュール (binascii、array、glob) が Visual Studio によって削除されます。

    Screenshot that shows the results of using the Remove Imports command to remove unused modules from the code in Visual Studio 2019.

  1. コードで、Visual Studio でスマート タグ (電球) が表示される import ステートメントにキャレットを配置します。 この例では、使用されていないモジュールの binascii、array、glob に対してスマート タグが表示されます。

    Screenshot that shows how to access options to remove unused imports in Visual Studio 2022.

  2. [未使用のインポートをすべて削除する] を選択するか、[使用されていないインポートの削除] オプションを選択して、選択されたモジュールのみを削除します。

  3. オプションを選択した後、ファイルに変更が加えられているかどうかを確認します。 この例では、使用されていない 3 つのモジュール (binascii、array、glob) が Visual Studio によって削除されます。

    Screenshot that shows the results of using the Remove all unused imports command in Visual Studio 2022.

リファクタリング コマンドを使用する場合の考慮事項

リファクタリング コマンドを使用する前に、以下の考慮事項を確認してください。

  • リファクタリング コマンドを実行した後は、[編集]>[元に戻す] コマンド使用をして、変更を元に戻すことができます。 [名前の変更] コマンドには [プレビュー] 機能が用意されているため、変更を適用する前に確認できます。

  • Visual Studio では、コード内の制御フローは考慮されません。 コード内に import ステートメントなどのサポート定義が存在する前に識別子を使用する場合、Visual Studio は識別子を使用済みとして処理します。 Visual Studio は、呼び出しおよび代入を行う前に、識別子のサポート定義を検索することを想定しています。

  • Visual Studio では、すべての from __future__ import ステートメントが無視されます。 これらのステートメントは、クラス定義内または from ... import * ステートメントを使用して実行されるインポートです。