La nouvelle version de pycharm (version 3.1.3 community) propose de convertir en statique les méthodes qui ne fonctionnent pas avec l'état actuel de l'objet.
Quelle est la raison pratique pour cela? Une sorte d'optimisation de la micro-performance (ou de la mémoire)?
PyCharm "pense" que vous pourriez avoir voul avoir une méthode statique, mais vous avez oublié de la déclarer comme statique.
PyCharm propose cela parce que la méthode ne tiliseself
pas dans son corps et ne fait donc pas réellement change l'instance de la classe. La méthode peut donc être statique, c’est-à-dire appelable sans avoir créé une instance de classe auparavant.
Convenu avec @jolvi, @ArundasR et d'autres, l'avertissement se produit sur une fonction membre qui n'utilise pas self
.
Si vous êtes sûr que PyCharm a tort, que la fonction ne devrait pas être un @staticmethod
, et si vous valorisez zéro warning, vous pouvez faire en sorte que celui-ci disparaisse de deux manières différentes:
Solution de contournement n ° 1
def bar(self):
self.is_not_used()
doing_something_without_self()
def is_not_used(self):
pass
Solution de contournement n ° 2 [Merci @ DavidPärsson ]
# noinspection PyMethodMayBeStatic
def bar(self):
doing_something_without_self()
L'application que j'avais pour cela (la raison pour laquelle je ne pouvais pas utiliser @staticmethod) consistait à créer une table de fonctions de gestionnaire pour répondre à un champ de sous-type de protocole. Tous les gestionnaires devaient avoir la même forme de parcours (statique ou non statique). Mais certains n'ont rien fait avec l'instance. Si je les rendais statique, j'obtiendrais l'objet "TypeError: 'staticmethod' 'n'est pas appelable".
À l'appui de la consternation de l'OP, vous suggérant d'ajouter la méthode statique à chaque fois que vous le pouvez, va à l'encontre du principe principe qu'il est plus facile de rendre le code moins restrictif plus tard que de le rendre plus - le fait de rendre une méthode statique le rend moins restrictif maintenant, en ce sens que vous pouvez appeler class.f () au lieu de instance.f ().
Devine pourquoi cet avertissement existe:
Je pense que la raison de cet avertissement est config dans Pycharm. Vous pouvez décocher la sélection La méthode peut être statique dans Editeur-> Inspection
Je peux imaginer les avantages suivants d’une méthode de classe définie comme statique:
les avantages restants sont probablement marginaux, voire inexistants:
Je suis d'accord avec les réponses données ici (la méthode n'utilise pas self
et pourrait donc être décorée avec @staticmethod
).
J'aimerais ajouter que vous souhaitez peut-être déplacer la méthode vers une fonction de niveau supérieur au lieu d'une méthode statique dans une classe. Pour plus de détails, voir cette question et la réponse acceptée: python - devrais-je utiliser des méthodes statiques ou des fonctions de niveau supérieur
Le déplacement de la méthode vers une fonction de niveau supérieur corrigera également l'avertissement PyCharm.
Ce message d'erreur m'a tout simplement aidé, car je n'avais pas réalisé que j'avais accidentellement écrit ma fonction avec mon lecteur de test
my_player.attributes[item]
au lieu de la bonne manière
self.attributes[item]
Puisque vous n'avez pas fait référence à self
dans le corps de la méthode bar
, PyCharm vous demande si vous pourriez avoir voulu faire bar
statique. Dans d'autres langages de programmation, tels que Java, il existe des raisons évidentes de déclarer une méthode statique. En Python, le seul avantage réel d'une méthode statique (AFIK) est de pouvoir l'appeler sans instance de la classe. Cependant, si c'est votre seule raison, vous feriez probablement mieux d'utiliser une fonction de niveau supérieur - comme note ici .
En bref, je ne suis pas sûr à cent pour cent pourquoi il est là. Je suppose qu'ils vont probablement l'enlever dans une prochaine version.
Cela peut être un peu compliqué, mais parfois vous n'avez pas besoin d'accéder à self
, mais vous préféreriez garder la méthode dans la classe et not la rendre statique. Ou vous voulez simplement éviter d'ajouter un groupe de décorateurs disgracieux. Voici quelques solutions de contournement possibles pour cette situation.
Si votre méthode n'a que des effets secondaires et que vous ne vous souciez pas de ce qu'elle retourne:
def bar(self):
doing_something_without_self()
return self
Si vous avez besoin de la valeur de retour:
def bar(self):
result = doing_something_without_self()
if self:
return result
Votre méthode utilise maintenant self
et l'avertissement disparaît!