web-dev-qa-db-fra.com

Pourquoi pylint fait-il des noms de variables à caractère unique?

Je m'habitue toujours aux conventions python et à l'utilisation de pylint pour rendre mon code plus pythonique), mais je suis déconcerté par le fait que pylint n'aime pas les variables à caractère unique J'ai quelques boucles comme celle-ci:

for x in x_values:
   my_list.append(x)

et quand je lance pylint, je reçois Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30} - cela suggère qu'un nom de variable valide doit comporter entre 3 et 31 caractères, mais j'ai parcouru conventions de dénomination PEP8 et je ne vois rien d'explicite concernant les lettres minuscules. et je vois beaucoup d’exemples qui les utilisent.

Est-ce qu'il manque quelque chose dans PEP8 ou s'agit-il d'une norme propre à pylint?

85
Amanda

PyLint vérifie non seulement les recommandations PEP8. Il a également ses propres recommandations, l'une d'elles étant qu'un nom de variable doit être descriptif et pas trop court.

Vous pouvez utiliser ceci pour éviter de tels noms courts:

my_list.extend(x_values)

Ou Tweak PyLint configuration pour dire à PyLint quels noms de variables sont bons.

47
warvariuc

Un peu plus de détails sur ce que gurney alex a noté: vous pouvez dire à PyLint de faire des exceptions pour noms de variables lesquelles (vous jurez, jurons) sont parfaitement claires même si moins de trois caractères. Recherchez ou ajoutez à votre fichier pylintrc , sous le fichier [FORMAT] entête:

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

Ici, pk (pour la clé primaire), x et y sont des noms de variables que j’ai ajoutés.

95
mlncn

Dans les langues fortement typées, les variables de nom 1 lettre peuvent être ok-ish, car vous obtenez généralement le type à côté du nom dans la déclaration de la variable ou dans le prototype de fonction/méthode:

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

En Python, vous n'obtenez pas cette information, donc si vous écrivez:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

vous ne laissez absolument aucune idée à l'équipe de maintenance de ce que la fonction pourrait faire, comment elle s'appelle et ce qu'elle renvoie. Donc, en Python, vous avez tendance à utiliser des noms descriptifs:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

et vous ajoutez même une docstring expliquant ce que font les choses et quels types sont attendus.

18
gurney alex

La raison la plus profonde est que vous pouvez vous souvenir de ce que vous vouliez a, b, c, x, y et z veut dire quand vous avez écrit votre code, mais quand d'autres le lisent, ou même quand vous revenez à votre code, le code devient beaucoup plus lisible quand vous lui donnez un nom sémantique. Nous n'écrivons pas de contenu une fois au tableau, puis ne l'effaçons. Nous écrivons du code qui pourrait durer une décennie ou plus, et être lu plusieurs fois.

Utilisez des noms sémantiques. Les noms sémantiques que j'ai utilisés ressemblent à ratio, denominator, obj_generator, path, etc. Cela peut prendre une seconde ou deux pour les taper, mais le temps que vous gagnez en essayant de comprendre ce que vous avez écrit même une demi-heure à partir de là en vaut vraiment la peine.

16
Aaron Hall

De nos jours, il existe également une option pour remplacer l'expression rationnelle. C'est à dire. si vous souhaitez autoriser des caractères uniques en tant que variables:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

Donc, pylint correspondra à PEP8 et n'entraînera pas de violations supplémentaires. Vous pouvez aussi l'ajouter à .pylintrc.

14
Jimilian