新しいpycharmリリース(3.1.3コミュニティエディション)では、現在のオブジェクトの状態で機能しないメソッドをstaticに変換することを提案しています。
その実際的な理由は何ですか?ある種のマイクロパフォーマンス(またはメモリ)最適化?
return 1
メソッドの単一行の実装があります。「その他」には有用なものが含まれていません
新しいpycharmリリース(3.1.3コミュニティエディション)では、現在のオブジェクトの状態で機能しないメソッドをstaticに変換することを提案しています。
その実際的な理由は何ですか?ある種のマイクロパフォーマンス(またはメモリ)最適化?
return 1
メソッドの単一行の実装があります。「その他」には有用なものが含まれていません
回答:
PyCharm は、静的メソッドが必要であると考えているが、それが静的であることを宣言するのを忘れている(@staticmethod
デコレータを使用)。
PyCharmはこれを提案します。メソッドがその本体で使用 しないため、クラスインスタンスをself
実際に変更しないためです。したがって、メソッドは静的、つまりクラスインスタンスを渡さずに、またはクラスインスタンスを作成しなくても呼び出すことができます。
NotImplementedError
ます。
self
ます。この場合、警告は無視でき、私はそれをでマークしてい# noinspection PyMethodMayBeStatic
ます。IntelliJ IDEAがこの警告のコンテキストメニューにこの無効化コメントを追加する機能を提供していないのは気の毒です。
@ jolvi、@ ArundasR、およびその他と同意し、警告はを使用しないメンバー関数で発生しますself
。
PyCharmが間違っていることが確かであり、関数がであってはならないこと@staticmethod
、およびゼロの警告を評価する場合、これを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を追加するよう提案することは、コードをより制限するよりも後で制限を少なくする方が簡単であるという原則に反します。メソッドを静的にすると、制限が緩和され、 instance.f()の代わりにclass.f()を呼び出します。
この警告が存在する理由について推測:
# noinspection PyMethodMayBeStatic
メソッドまたはクラスの上に追加すると警告が抑制され、空のメソッドを呼び出すよりも良いと思います。
self
Python3ではまったく削除されていません。
この警告の理由はPycharmの設定にあると思います。選択のチェックを外すことができます方法は静的-エディター->インスペクション
私はここで与えられた答えに同意します(メソッドは使用しないためself
、で装飾できます@staticmethod
)。
メソッドをクラス内の静的メソッドではなくトップレベルの関数に移動したい場合があることを付け加えておきます。詳細については、この質問と承認された回答を参照してください:python-静的メソッドまたはトップレベル関数を使用する必要があります
メソッドをトップレベルの関数に移動すると、PyCharm警告も修正されます。
self
、パラメータではない場合でも、静的メソッドではなくトップレベルの関数を作成します。
self
ため、トップレベルである可能性がありますが、このメソッドが何をするかを見るとこれは論理的に感じられません-トップレベルとしては、グローバルメソッドのように見えます実際、そのクラスから作成されたインスタンスの小さなヘルパーメソッド。したがって、コードを論理的に整理するには、デコレータが最適なソリューションです。
クラスメソッドを静的メソッドとして定義することの次の利点を想像できます。
残りの利点は、もし存在するとしても、おそらくわずかです。
bit
高速で実行することは重要ではありません(どちらの場合もRAMで実行するので高速なので)bunch
。また、最初の考えにも注意してください。これは手続き型の動作であり、オブジェクト指向の動作ではありません。
少し面倒かもしれませんが、にアクセスする必要がない場合もありますself
が、メソッドをクラスに保持し、静的にしない方がよいでしょう。または、見苦しいデコレータの追加を避けたいだけです。ここでは、そのような状況に対する潜在的な回避策をいくつか示します。
メソッドに副作用しかなく、何が返されるかを気にしない場合:
def bar(self):
doing_something_without_self()
return self
戻り値が必要な場合:
def bar(self):
result = doing_something_without_self()
if self:
return result
これで、メソッドはを使用self
しており、警告は消えます!
Pythonが非静的メソッド(@staticmethodを追加しない)を呼び出すときに最初の引数としてselfを渡すため、Pycharmが警告としてそれを行う理由。Pycharmはそれを知っています。
例:
class T:
def test():
print "i am a normal method!"
t = T()
t.test()
output:
Traceback (most recent call last):
File "F:/Workspace/test_script/test.py", line 28, in <module>
T().test()
TypeError: test() takes no arguments (1 given)
私はJavaの出身です。Javaでは「self」は「this」と呼ばれ、クラスメソッドの引数としてself(またはthis)を記述する必要はありません。メソッド内で必要に応じて、自分自身を呼び出すことができます。しかし、Pythonはメソッド引数として自分自身を「渡さなければなりません」。
これを理解することで、@ BobSteinの回答のような回避策は必要ありません。
self
何で合格?
self
メソッド内のどこかを参照していますか?(本当にPyCharmのデザイナーがなぜこのように設計したのかという質問である場合は、SOではなく質問する必要があります...)