La nouvelle version de pycharm (édition communautaire 3.1.3) propose de convertir les méthodes qui ne fonctionnent pas avec l'état actuel de l'objet en statique.
Quelle en est la raison pratique? Une sorte d'optimisation des micro-performances (-ou-mémoire)?
self
n'importe où dans la méthode? (Si la question est vraiment "pourquoi les concepteurs de PyCharm l'ont-ils conçu de cette façon ... vous devrez leur demander, pas SO ...)return 1
qu'une seule ligne d'implémentation de la méthode. "Plus" ne contient rien d'utileRéponses:
PyCharm "pense" que vous auriez peut-être voulu avoir une méthode statique, mais vous avez oublié de la déclarer statique (en utilisant le
@staticmethod
décorateur).PyCharm propose cela parce que la méthode n'utilise
self
dans son corps et donc ne pas vraiment changer l'instance de classe . La méthode peut donc être statique, c'est-à-dire appelable sans passer une instance de classe ou sans même avoir créé une instance de classe.la source
NotImplementedError
.self
. Dans ce cas, l'avertissement est négligeable et je le marque avec# noinspection PyMethodMayBeStatic
. C'est dommage qu'IntelliJ IDEA ne propose pas d'ajouter ce commentaire de désactivation dans les menus contextuels de cet avertissement.En accord 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 est erroné, que la fonction ne doit pas être a
@staticmethod
, et si vous n'évaluez aucun avertissement, vous pouvez faire disparaître celui-ci de deux manières différentes:Solution de contournement n ° 1
Solution de contournement n ° 2 [Merci @ DavidPärsson ]
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 bien sûr être de la même forme (statique ou non statique). Mais certains n'ont rien fait avec l'instance. Si je les rendais statiques, j'obtiendrais "TypeError: l'objet 'staticmethod' n'est pas appelable".
À l'appui de la consternation de l'OP, suggérer d'ajouter une méthode statique chaque fois que vous le pouvez, va à l'encontre du principe selon lequel il est plus facile de rendre le code moins restrictif plus tard que de le rendre plus - rendre une méthode statique la rend moins restrictive maintenant, en ce sens que vous pouvez appelez class.f () au lieu de instance.f ().
Devinez pourquoi cet avertissement existe:
la source
# noinspection PyMethodMayBeStatic
au-dessus de la méthode ou de la classe supprime l'avertissement, et est à mon avis mieux que d'appeler une méthode vide.self
n'est pas du tout supprimé dans Python3.Je pense que la raison de cet avertissement est la configuration dans Pycharm. Vous pouvez décocher la sélection La méthode peut être statique dans Editeur-> Inspection
la source
Je suis d'accord avec les réponses données ici (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 à l'intérieur d'une classe. Pour plus de détails, consultez cette question et la réponse acceptée: python - dois-je utiliser des méthodes statiques ou des fonctions de niveau supérieur
Déplacer la méthode vers une fonction de niveau supérieur corrigera également l'avertissement PyCharm.
la source
self
n'est pas un paramètre.self
et qui pourrait donc être de premier niveau, cependant, cela ne semble pas logique quand on regarde ce que fait cette méthode - en tant que niveau supérieur, elle ressemblerait davantage à une méthode globale, alors qu'elle est en fait une petite méthode d'assistance pour les instances créées à partir de cette classe. Donc, pour garder mon code organisé de manière logique, le décorateur est la solution parfaite.Je peux imaginer les avantages suivants d'avoir une méthode de classe définie comme statique:
les avantages restants sont probablement marginaux, voire présents:
la source
bit
courir plus vite n'est pas le point (car ils fonctionnent en RAM, donc c'est rapide dans les deux cas) et comme vous le savez, les ordinateurs ont maintenantbunch
de la mémoire, ce n'est donc plus un problème. Notez également votre première pensée: c'est un comportement procédural et non orienté objet.Puisque vous n'avez pas fait référence
self
dans lebar
corps de la méthode, PyCharm vous demande si vous auriez pu vouloir rendrebar
statique. Dans d'autres langages de programmation, comme Java, il y a des raisons évidentes de déclarer une méthode statique. En Python, le seul réel avantage d'une méthode statique (AFIK) est de pouvoir l'appeler sans instance de la classe. Cependant, si c'est votre seule raison, il vaut probablement mieux utiliser une fonction de haut niveau - comme indiqué ici .En bref, je ne sais pas à cent pour cent pourquoi c'est là. Je suppose qu'ils le supprimeront probablement dans une prochaine version.
la source
Ce message d'erreur m'a aidé beaucoup, car je n'avais pas réalisé que j'avais accidentellement écrit ma fonction en utilisant mon lecteur d'exemple de test
au lieu de la bonne manière
la source
Cela peut être un peu compliqué, mais parfois vous n'avez tout simplement pas besoin d'y accéder
self
, mais vous préféreriez garder la méthode dans la classe et ne pas la rendre statique. Ou vous voulez simplement éviter d'ajouter un tas de décorateurs disgracieux. Voici quelques solutions de contournement potentielles pour cette situation.Si votre méthode n'a que des effets secondaires et que vous ne vous souciez pas de ce qu'elle renvoie:
Si vous avez besoin de la valeur de retour:
Maintenant, votre méthode utilise
self
et l'avertissement disparaît!la source
La raison pour laquelle Pycharm en fait un avertissement parce que Python passera self comme premier argument lors de l'appel d'une méthode non statique (sans ajouter @staticmethod). Pycharm le sait.
Exemple:
Je viens de Java, en Java "self" s'appelle "this", vous n'avez pas besoin d'écrire self (ou this) comme argument dans la méthode de classe. Vous pouvez simplement vous appeler selon vos besoins dans la méthode. Mais Python "doit" passer soi-même comme argument de méthode.
En comprenant cela, vous n'avez besoin d'aucune solution de contournement en tant que réponse @BobStein.
la source
self
alors quoi?