Comment supprimer les Avertissements" variable inutilisée " dans Eclipse / PyDev

comment supprimer les Avertissements "variable inutilisée" dans Eclipse / PyDev

quand je travaille avec des fonctions qui renvoient des tuples, Je n'ai souvent besoin que d'une seule des valeurs, mais je veux quand même attribuer à plusieurs variables. Je voudrais pouvoir désactiver temporairement cet avertissement afin de pouvoir me concentrer sur des problèmes plus graves. Ensuite, je peux le rallumer en faisant plus d'un contrôle final.

si vous vous demandez pourquoi je le fais délibérément, c'est juste pour la lisibilité. Dire la fonction retourne un tuple de tuples, plusieurs parties de mon code peut travailler avec la troisième valeur comme ceci:

label, content = myfunc()[2]

parfois, je ne m'intéresse qu'au "contenu", mais je trouve ça...

tmp, content = myfunc()[2]

...plus parallèle (et donc plus lisible) que ceci:

content = myfunc()[2][1]

S'il y a une meilleure façon de le faire simplement sans affecter à une variable jetable inutilisée, n'hésitez pas à fournir cette réponse.

>>> myfunc()[2]
('lab', 'val')
>>> , v = myfunc()[2]
SyntaxError: invalid syntax
>>> tmp, v = myfunc()[2]
>>> 
20
demandé sur Natan 2012-12-19 05:24:00

5 réponses

Si vous n'avez pas besoin de la valeur d'une variable, l'affecter à la variable spéciale _.

en ce qui concerne Python, il n'y a en fait rien de spécial à propos de _; c'est juste un autre nom de l'identificateur comme les autres.

Cependant, pour la plupart des outils de style "lint"(avec un peu de Chance y compris PyDev)-et, plus important encore, les lecteurs humains-il a la signification spéciale que "je n'ai pas besoin de cette variable, je mets seulement quelque chose ici parce que L'API / syntaxe / quoi que ce soit l'exige". Ce qui veut dire qu'ils ne vous préviendront pas de ne pas l'utiliser.

Donc:

_, content = myfunc()[2]

Et oui, vous avez raison, c'est souvent plus lisible que myfunc()[2][1]. Non seulement cela, mais il vous aide à attraper quelques erreurs supplémentaires-si myfunc()[2] n'a pas exactement deux membres, la tâche de tuple lancera, mais le [1] ne sera pas.

Très, très rarement, ce n'est pas une bonne idée parce que la valeur est quelque chose que vous voulez être nettoyés dès que possible, et de la lier à _ au lieu de simplement ne pas le lier du tout (par exemple, via [2][1]) retards.

plus sérieusement, cela entre en conflit avec un autre idiome qui utilise aussi_: Code qui utilise gettext pour l'internationalisation généralement:

import gettext
_ = gettext.gettext

Ou, de manière équivalente:

from gettext import gettext as _

Evidemment vous ne pouvez pas utiliser _ à la fois comme raccourci gettext et comme Identificateur sans signification. (Vous réellement obtenir loin avec elle, parce que le gettext la signification est liée au niveau du module-global, et l'identifiant sans signification ne doit être utilisé qu'à l'intérieur des corps de fonctions... mais c'est quand même une très mauvaise idée d'essayer, parce qu'à un moment donné vous finirez par utiliser le gettext_ dans une fonction après avoir assigné une valeur locale qui l'assombrit.) Rien ne vous oblige à utiliser _ dans les deux cas-mais si vous utilisez quoi que ce soit d'autre, vous êtes susceptible de confondre les lecteurs (et peut-être le même outil de linting que vous cherchez à pacifier, en premier lieu). Donc, vous avez à décider lequel est le plus important pour vous dans un projet donné. (Et, en général, si vous utilisez gettext, qui va être le plus important.)

Si vous êtes à plusieurs reprises d'appeler myfunc et de disposer de certaines des valeurs, vous pourriez envisager d'écrire une fonction wrapper:

def mywrapperfunc():
    _, content = myfunc()[2]
    return content

Ensuite, ton code peut tout simplement faire:

content = mywrapperfunc()

Cela a un certain nombre d'avantages:

  • C'est évidemment plus facile à lire que tout ce qui nécessite de se rappeler que vous voulez la seconde moitié d'un tuple qui est dans l'index 2 de la séquence qui est retourné par myfunc.
  • Il vous donne un endroit pour mettre un joli nom (j'espère plus agréable que mywrapperfunc) et/ou des commentaires / cordes, au cas où ce ne serait pas trivial.
  • Cela signifie que si vous modifiez ultérieurement myfunc ainsi la valeur que vous voulez est maintenant dans l'index 3 au lieu de 2, et le deuxième membre d'un tuple de 3 éléments au lieu d'un 2-élément d'un tuple, vous avez seulement besoin de changer mywrapperfunc au lieu de 20 lignes de code.
  • cela signifie aussi que si vous voulez utiliser plus tard un_ idiome (par exemple, pour l'i18n votre code avec gettext), il suffit de le changer en un seul endroit.

Une note de côté: Dans interactive interprète, _ ont une signification particulière: il est lié au résultat de la dernière commande interactive. Mais cela ne signifie pas que vous ne pouvez pas utiliser _ dans interactive interprète. (En fait, c'est encore mieux là-bas, parce que tout ce que vous planquez là-bas est immédiatement réécrit, de sorte que le très rare problème GC ne se présente pas.)

37
répondu abarnert 2012-12-19 01:50:43

Ajouter un commentaire #@UnusedVariable à la fin de la ligne.

chaque avertissement dans PyDev a un commentaire de désactivation similaire. Utilisez Quick Fix pour les découvrir (placez le curseur dans l'avertissement et appuyez sur Ctrl+1), ou référez-vous à ces lignes à partir du code source PyDev:

public static final String MSG_TO_IGNORE_TYPE_UNUSED_IMPORT = "@UnusedImport";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_WILD_IMPORT = "@UnusedWildImport";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_VARIABLE = "@UnusedVariable";
public static final String MSG_TO_IGNORE_TYPE_UNDEFINED_VARIABLE = "@UndefinedVariable";
public static final String MSG_TO_IGNORE_TYPE_DUPLICATED_SIGNATURE = "@DuplicatedSignature";
public static final String MSG_TO_IGNORE_TYPE_REIMPORT = "@Reimport";
public static final String MSG_TO_IGNORE_TYPE_UNRESOLVED_IMPORT = "@UnresolvedImport";
public static final String MSG_TO_IGNORE_TYPE_NO_SELF = "@NoSelf";
public static final String MSG_TO_IGNORE_TYPE_UNDEFINED_IMPORT_VARIABLE = "@UndefinedVariable";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_PARAMETER = "@UnusedVariable";
public static final String MSG_TO_IGNORE_TYPE_NO_EFFECT_STMT = "@NoEffect";
public static final String MSG_TO_IGNORE_TYPE_INDENTATION_PROBLEM = "@IndentOk";
public static final String MSG_TO_IGNORE_TYPE_ASSIGNMENT_TO_BUILT_IN_SYMBOL = "@ReservedAssignment";
public static final String MSG_TO_IGNORE_TYPE_PEP8 = "@IgnorePep8";
public static final String MSG_TO_IGNORE_TYPE_ARGUMENTS_MISATCH = "@ArgumentMismatch";
20
répondu joshua 2018-07-17 22:04:07

Préférences -> PyDev -> Editeur -> l'Analyse de Code , "Inutilisé" de l'onglet

trouver le paramètre pour

ne déclarez pas la variable inutilisée si le nom commence par: (virgule séparée)

et ensuite utiliser un des préfixes de cette liste, ou ajouter un autre préfixe.

par exemple, si vous avez une variable throwaway "tmp" dans le code suivant:

tmp, content = myfunc()[2]

et vous avez '_' sur votre liste de préfixes à ignorer, puis de les convertir "tmp" "_tmp" comme ceci:

_tmp, content = myfunc()[2]

votre erreur disparaîtra. Je pense que c'est une solution plus lisible que de simplement utiliser"_", comme suggéré par @abarnert, et cela évite également les complications d'entrer en conflit avec la traduction.

5
répondu Mark Chackerian 2013-07-25 17:47:22

j'ai rencontré ceci quelques fois quand j'utilise une fonctionnalité similaire à celle que vous décrivez quand un tuple est retourné. Vous pouvez définir globalement les niveaux d'avertissement pour l'analyse du code de PyDev dans la section Préférences -> PyDev -> Editeur -> analyse du Code. Dans L'analyse de Code dans l'onglet non utilisé, il y a une option pour définir le niveau d'AVERTISSEMENT Pour "variable non utilisée" ainsi que d'autres événements.

3
répondu sid16rgt 2012-12-19 01:38:11

Ou, vous pouvez supprimer un avertissement donné dans Eclipse langage (y compris Python) utilisant un plugin supplémentaire. http://suppresswarnings.drupalgardens.com

Également disponible sur le marché:

https://marketplace.eclipse.org/content/marker-manager

0
répondu Philippe 2014-06-29 09:10:51