新しいpycharmリリース(3.1.3コミュニティエディション)では、現在のオブジェクトの状態で動作しないメソッドを静的に変換することを提案しています。
その実用的な理由は何ですか?ある種のマイクロパフォーマンス(またはメモリ)の最適化?
PyCharmは、静的メソッドを持つためにwantedを持つ可能性があると考えていますが、静的メソッドとして宣言するのを忘れていました。
PyCharmはこれを提案します。なぜなら、メソッドは本体でseself
を使用せず、したがって実際にはクラスインスタンスを変更するではないからです。したがって、メソッドは静的である可能性があります。つまり、以前にクラスインスタンスを作成せずに呼び出し可能です。
@ 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()を呼び出すことができるという点で制限があります。
この警告が存在する理由を推測します。
この警告の理由はPycharmの設定だと思います。選択を解除できますメソッドは静的かもしれません Editor-> Inspectionで
クラスメソッドを静的メソッドとして定義することの次の利点を想像できます。
残りの利点は、存在する場合でもおそらくわずかです:
ここで与えられた答えに同意します(メソッドはself
を使用しないため、@staticmethod
で修飾できます)。
クラス内の静的メソッドではなく、トップレベル関数にメソッドを移動したいかもしれないことを付け加えたいと思います。詳細については、この質問と受け入れられた答えを参照してください: python-静的メソッドまたはトップレベル関数を使用する必要があります
メソッドを最上位関数に移動すると、PyCharmの警告も修正されます。
このエラーメッセージは、テスト用のサンプルプレーヤーを使用して誤って関数を記述したことに気付いていなかったので、私を助けてくれました。
my_player.attributes[item]
正しい方法の代わりに
self.attributes[item]
self
メソッド本体でbar
を参照しなかったため、PyCharmはmightがbar
を静的にしたいかどうかを尋ねています。 Javaのような他のプログラミング言語では、静的メソッドを宣言する明白な理由があります。 Pythonでは、静的メソッド(AFIK)の唯一の本当の利点は、クラスのインスタンスなしで呼び出すことができることです。ただし、それが唯一の理由である場合は、おそらく here のように、トップレベルの関数を使用する方が良いでしょう。
要するに、私はそれがそこにある理由を100パーセント確信していません。彼らはおそらく今後のリリースでそれを削除するだろうと思います。
少々面倒かもしれませんが、時にはself
にアクセスする必要はありませんが、メソッドをクラスに保持し、notを静的にすることをお勧めします。または、見苦しいデコレータの束を追加したくないだけです。その状況の潜在的な回避策を次に示します。
メソッドに副作用のみがあり、返されるものを気にしない場合:
def bar(self):
doing_something_without_self()
return self
戻り値が必要な場合:
def bar(self):
result = doing_something_without_self()
if self:
return result
これでメソッドはself
を使用し、警告は消えます!