web-dev-qa-db-fra.com

Pourquoi pycharm propose de changer de méthode en statique

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.

enter image description here

Quelle est la raison pratique pour cela? Une sorte d'optimisation de la micro-performance (ou de la mémoire)?

124
zerkms

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.

140
jolvi

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:

  • Il annonce staticmethod . Cela permet aux développeurs de prendre conscience de quelque chose qu'ils ont peut-être voulu.
  • Comme le fait remarquer @ JohnWorrall, votre attention est attirée lorsque lui-même a été oublié par inadvertance de la fonction.
  • C'est un repère pour repenser le modèle d'objet; peut-être la fonction n'appartient pas à cette classe.
44
Bob Stein

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

11
mincom

Je peux imaginer les avantages suivants d’une méthode de classe définie comme statique:

  • vous pouvez appeler la méthode en utilisant simplement le nom de la classe, pas besoin de l'instancier.

les avantages restants sont probablement marginaux, voire inexistants:

  • pourrait courir un peu plus vite
  • économiser un peu de mémoire
7
Jan Vlcinsky

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.

6
tlo

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]
3
John Worrall

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.

3
Don

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!

1
Junuxx