PyCharm 2024.3 ヘルプ

PyCharm リファクタリングチュートリアル

このチュートリアルの内容

このチュートリアルでは、有理数を利用する単純なクラスの例を使用して、PyCharm で利用可能ないくつかのリファクタリングを示します。

前提条件

次の前提条件が満たされていることを確認してください。

  • PyCharm バージョン 2016.2 以降で作業しています。

  • プロジェクトはすでに作成されています。

例の準備

プロジェクトに Python ファイル rational.py を作成し、次のコードを追加します。

from collections import namedtuple class Rational(namedtuple('Rational', ['num', 'denom'])): def __new__(cls, num, denom): if denom == 0: raise ValueError('Denominator cannot be null') if denom < 0: num, denom = -num, -denom return super().__new__(cls, num, denom) def __str__(self): return '{}/{}'.format(self.num, self.denom)

有理数を単純化する

分子と分母を最大公約数で除算して有理数を単純化しましょう:

from collections import namedtuple class Rational(namedtuple('Rational', ['num', 'denom'])): def __new__(cls, num, denom): if denom == 0: raise ValueError('Denominator cannot be null') if denom < 0: num, denom = -num, -denom x = abs(num) y = abs(denom) while x: x, y = y % x, x factor = y return super().__new__(cls, num // factor, denom // factor) def __str__(self): return '{}/{}'.format(self.num, self.denom)

メソッドの抽出

ここでは、最も大きな共通の除数の検索を別の方法に抽出しましょう。これを行うには、ステートメントを選択します

x = abs(num) y = abs(denom) while x: x, y = y % x, x factor = y

そして Ctrl+Alt+M を押します。開いたダイアログでメソッド名 gcd を入力し、OK をクリックします。

@staticmethod def gcd(denom, num): x = abs(num) y = abs(denom) while x: x, y = y % x, x factor = y return factor

ローカル変数のインライン化とメソッドシグネチャーの変更

変数のインライン化リファクタリングを使って、変数 factor を取り除きましょう。そのためには、変数にキャレットを置いて Ctrl+Alt+N を押します。検出された factor 変数はすべてインライン化されています。

次に、シグネチャーの変更を使ってパラメーター名を変更します。そのためには、メソッド宣言行にキャレットを置き、Ctrl+F6 を押します。開いたダイアログで、パラメーター denomnum をそれぞれ xy に名前変更し、 をクリックしてパラメーターの順序を変更します。

次のコードで終わります:

@staticmethod def gcd(x, y): x = abs(x) y = abs(y) while x: x, y = y % x, x return y

クイックフィックスの使用

既存の静的メソッドを関数に変換しましょう。これを行うには、Alt+Enter を押し、候補リストから static メソッドを関数に変換するを選択し、Enter を押します:

from collections import namedtuple class Rational(namedtuple('Rational', ['num', 'denom'])): def __new__(cls, num, denom): if denom == 0: raise ValueError('Denominator cannot be null') if denom < 0: num, denom = -num, -denom factor = gcd(num, denom) return super().__new__(cls, num // factor, denom // factor) def __str__(self): return '{}/{}'.format(self.num, self.denom) def gcd(x, y): x = abs(x) y = abs(y) while x: x, y = y % x, x return y

関数を別のファイルに移動する

それでは、関数を別のファイルに移動して import ステートメントを追加します。そのためには、関数 gcd 宣言にキャレットを置き、F6 を押します。開いたダイアログで、宛先ファイル util.py の完全修飾パスを指定します。このファイルは存在しませんが、自動的に作成されます。

def gcd(x, y): x = abs(x) y = abs(y) while x: x, y = y % x, x return y

インポート文も自動的に追加されます。ファイル rational.py は次のようになります。

from collections import namedtuple from util import gcd class Rational(namedtuple('Rational', ['num', 'denom'])): def __new__(cls, num, denom): if denom == 0: raise ValueError('Denominator cannot be null') if denom < 0: num, denom = -num, -denom factor = gcd(num, denom) return super().__new__(cls, num // factor, denom // factor) def __str__(self): return '{}/{}'.format(self.num, self.denom)

クラス Rational のさらなる変更

マジックメソッドの追加

次に、クラス Rational のオブジェクトに対する加算 / 減算演算用のマジックメソッドの宣言を追加しましょう。

from collections import namedtuple from util import gcd class Rational(namedtuple('Rational', ['num', 'denom'])): def __new__(cls, num, denom): if denom == 0: raise ValueError('Denominator cannot be null') factor = gcd(num, denom) if denom < 0: num, denom = -num, -denom return super().__new__(cls, num // factor, denom // factor) def __str__(self): return '{}/{}'.format(self.num, self.denom) def __add__(self, other): if isinstance(other, int): other = Rational(other, 1) if isinstance(other, Rational): new_num = self.num * other.denom + other.num * self.denom new_denom = self.denom * other.denom return Rational(new_num, new_denom) return NotImplemented def __neg__(self): return Rational(-self.num, self.denom) def __radd__(self, other): return self + other def __sub__(self, other): return self + (-other) def __rsub__(self, other): return -self + other

メソッドの抽出とクイックフィックスの使用

次に、式 Rational(other, 1) を別のメソッドに抽出します。これを行うには、前述の式にキャレットを置き、Ctrl+Alt+M を押し、開いたダイアログに新しいメソッド名 from_int を入力します。

最後に、メソッド from_int 宣言にキャレットを置き、Alt+Enter を押し、候補リストからメソッドを static にするを選択し、Enter を押します。

@staticmethod def from_int(other): return Rational(other, 1)

最後に、パラメーターの名前を other から number に変更しましょう。これを行うには、パラメーターにキャレットを置き、Shift+F6 を押します。

スーパークラスの抽出

次に、メソッド __radd____sub____rsub__ の実装をスーパークラスに移動します。また、メソッド __neg____add__ を抽象化します。

その方法は次のとおりです ... クラス Rational 宣言にキャレットを置き、コンテキストメニューでリファクタリング | 抽出をポイントし、スーパークラスの抽出 ... を選択します。次に、開いたダイアログでスーパークラスの名前 (ここでは AdditiveMixin) を指定し、スーパークラスに追加するメソッドを選択します。メソッド __neg__ および __add__ の場合、列 abstract にするのチェックボックスを選択します。詳細については、「スーパークラスの抽出」を参照してください。

次のコードで終了します。

from abc import abstractmethod, ABCMeta from collections import namedtuple from util import gcd class AdditiveMixin(metaclass=ABCMeta): @abstractmethod def __add__(self, other): pass @abstractmethod def __neg__(self): pass def __radd__(self, other): return self + other def __sub__(self, other): return self + (-other) def __rsub__(self, other): return -self + other class Rational(namedtuple('Rational', ['num', 'denom']), AdditiveMixin): def __new__(cls, num, denom): if denom == 0: raise ValueError('Denominator cannot be null') factor = gcd(num, denom) if denom < 0: num, denom = -num, -denom return super().__new__(cls, num // factor, denom // factor) def __str__(self): return '{}/{}'.format(self.num, self.denom) def __add__(self, other): if isinstance(other, int): other = self.from_int(other) if isinstance(other, Rational): new_num = self.num * other.denom + other.num * self.denom new_denom = self.denom * other.denom return Rational(new_num, new_denom) return NotImplemented def from_int(self, number): return Rational(number, 1) def __neg__(self): return Rational(-self.num, self.denom)

関連ページ:

メソッドの抽出ダイアログ

JavaScript コンテキストでは、ダイアログのタイトルが関数の抽出に変更される場合があります。名前このフィールドには、選択したソースコードに基づいて生成する関数またはメソッドの名前を指定します。パラメーターこの領域で、新しいメソッド / 関数に渡すパラメーターを選択します。上 / 下に移動これらのボタンを使用して、パラメーターの順序を変更します。シグネチャープレビューこの読み取り専用フィールドに、新しいメソッド / 関数の宣言を表示します。出力変数この読み取り専用フィールドは、メソッド本文...

インライン化

インライン化リファクタリングでは、メソッドまたは変数の導入リファクタリングを元に戻すことができます。インライン化するコードフラグメントにキャレットを配置します。を押します。または、コードフラグメントを右クリックして、メニューに移動します。必要なインラインリファクタリングを選択します。インライン化ダイアログで、インライン化オプションを指定します。プレビューと変更の適用、変数のインライン化:変数のインライン化リファクタリングは、冗長な変数の使用をイニシャライザーに置き換えます。変数は宣言時に初期化

シグネチャーの変更

シグネチャーの変更リファクタリングは、関数シグネチャーに適用できるいくつかの異なる変更を組み合わせます。このリファクタリングを使用して、次のことができます。関数名を変更する、パラメーターの追加、削除、並べ替え、パラメーターにデフォルト値を割り当てます、関数のシグネチャーを変更すると、PyCharm は関数のすべての使用箇所を検索し、変更、反映、変更を安全に修正できる関数のすべての呼び出し、実装、置き換えを置き換えます。パラメーターの追加赤色でハイライトされている値をクリックします。を押してパラメ...

スーパークラスの抽出

スーパークラスの抽出リファクタリングを使用すると、既存のクラスのスーパークラスを作成できます。元のクラスのメンバーをスーパークラスに移動できます。メソッドの場合、スーパークラスでメソッドを抽象として宣言して、メソッド宣言のみを転送できますが、実装は転送できません。その結果、スーパークラスと、スーパークラスを継承する元のクラスが作成されます。スーパークラスを抽出するエディターのクラス内にキャレットを配置します。メインメニューからを選択するか、コンテキストメニューからを選択します。スーパークラスの抽...

コードリファレンス情報

このセクションでは、シンボルの定義を表示し、ドキュメント参照を表示し、ビューパラメーター情報機能を使用する方法について説明します。パラメーター情報:パラメーター情報ポップアップには、メソッド呼び出しと関数呼び出しのパラメーターの名前が表示されます。PyCharm は、エディターで左括弧を入力するか、候補リストからメソッドを選択すると、1 秒 (1000 ミリ秒) 以内に、使用可能なすべてのメソッドシグネチャーを含むポップアップを自動的に表示します。ポップアップが閉じている場合、または IDE...