web-dev-qa-db-ja.com

pycharmがメソッドを静的に変更することを提案する理由

新しいpycharmリリース(3.1.3コミュニティエディション)では、現在のオブジェクトの状態で動作しないメソッドを静的に変換することを提案しています。

enter image description here

その実用的な理由は何ですか?ある種のマイクロパフォーマンス(またはメモリ)の最適化?

124
zerkms

PyCharmは、静的メソッドを持つためにwantedを持つ可能性があると考えていますが、静的メソッドとして宣言するのを忘れていました。

PyCharmはこれを提案します。なぜなら、メソッドは本体でseselfを使用せず、したがって実際にはクラスインスタンスを変更するではないからです。したがって、メソッドは静的である可能性があります。つまり、以前にクラスインスタンスを作成せずに呼び出し可能です。

140
jolvi

@ jolvi、@ ArundasRなどに同意すると、selfを使用しないメンバー関数で警告が発生します。

PyCharmが間違っていると確信している場合、関数が@staticmethodであってはならず、警告が0である場合、これを2つの異なる方法で無効にすることができます。

回避策#1

def bar(self):
    self.is_not_used()
    doing_something_without_self()

def is_not_used(self):
    pass

回避策#2 [ありがとう @DavidPärsson ]

# noinspection PyMethodMayBeStatic
def bar(self):
    doing_something_without_self()

これに使用したアプリケーション(@staticmethodを使用できなかった理由)は、プロトコルサブタイプフィールドに応答するためのハンドラー関数のテーブルを作成することでした。すべてのハンドラーは、同じ形式(静的または非静的)でなければなりませんでした。しかし、インスタンスで何もしなかった人もいました。それらを静的にした場合、「TypeError: 'staticmethod' object is not callable」と表示されます。

OPの制約をサポートするため、可能な場合は常にstaticmethodを追加することを提案しますが、 principle に反します。コードをより制限する方が、後でより制限を緩和する方が簡単です。 instance.f()の代わりにclass.f()を呼び出すことができるという点で制限があります。

この警告が存在する理由を推測します。

  • それはstaticmethodをアドバタイズします。開発者が意図したことを認識できるようにします。
  • @JohnWorrallが指摘しているように、selfが関数から意図せずに除外された場合に注意を引きます。
  • オブジェクトモデルを再考する手がかりです。多分関数はこのクラスにまったく属していません
44
Bob Stein

この警告の理由はPycharmの設定だと思います。選択を解除できますメソッドは静的かもしれません Editor-> Inspectionで

11
mincom

クラスメソッドを静的メソッドとして定義することの次の利点を想像できます。

  • クラス名を使用するだけでメソッドを呼び出すことができ、インスタンス化する必要はありません。

残りの利点は、存在する場合でもおそらくわずかです:

  • 少し速くなるかもしれません
  • メモリを少し節約する
7
Jan Vlcinsky

ここで与えられた答えに同意します(メソッドはselfを使用しないため、@staticmethodで修飾できます)。

クラス内の静的メソッドではなく、トップレベル関数にメソッドを移動したいかもしれないことを付け加えたいと思います。詳細については、この質問と受け入れられた答えを参照してください: python-静的メソッドまたはトップレベル関数を使用する必要があります

メソッドを最上位関数に移動すると、PyCharmの警告も修正されます。

6
tlo

このエラーメッセージは、テスト用のサンプルプレーヤーを使用して誤って関数を記述したことに気付いていなかったので、私を助けてくれました。

my_player.attributes[item] 

正しい方法の代わりに

self.attributes[item]
3
John Worrall

selfメソッド本体でbarを参照しなかったため、PyCharmはmightbarを静的にしたいかどうかを尋ねています。 Javaのような他のプログラミング言語では、静的メソッドを宣言する明白な理由があります。 Pythonでは、静的メソッド(AFIK)の唯一の本当の利点は、クラスのインスタンスなしで呼び出すことができることです。ただし、それが唯一の理由である場合は、おそらく here のように、トップレベルの関数を使用する方が良いでしょう。

要するに、私はそれがそこにある理由を100パーセント確信していません。彼らはおそらく今後のリリースでそれを削除するだろうと思います。

3
Don

少々面倒かもしれませんが、時にはselfにアクセスする必要はありませんが、メソッドをクラスに保持し、notを静的にすることをお勧めします。または、見苦しいデコレータの束を追加したくないだけです。その状況の潜在的な回避策を次に示します。

メソッドに副作用のみがあり、返されるものを気にしない場合:

def bar(self):
    doing_something_without_self()
    return self

戻り値が必要な場合:

def bar(self):
    result = doing_something_without_self()
    if self:
        return result

これでメソッドはselfを使用し、警告は消えます!

1
Junuxx