Pourquoi pylint s'oppose-t-il aux noms de variables à caractère unique?

96

Je suis toujours en train de m'habituer aux conventions python et à les utiliser pylintpour rendre mon code plus pythonique, mais je suis déconcerté par le fait que pylint n'aime pas les noms de variables à caractère unique. J'ai quelques boucles comme celle-ci:

for x in x_values:
   my_list.append(x)

et quand je cours pylint, j'obtiens 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 contenir entre 3 et 31 caractères, mais j'ai regardé à travers les conventions de dénomination PEP8 et je ne vois rien d'explicite concernant les lettres minuscules simples , et je vois beaucoup d'exemples qui les utilisent.

Y a-t-il quelque chose qui me manque dans PEP8 ou s'agit-il d'une norme propre à pylint?

Amanda
la source

Réponses:

47

PyLint vérifie non seulement les recommandations PEP8. Il a également ses propres recommandations, dont l'une est 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 modifiez la configuration de PyLint pour indiquer à PyLint quel nom de variable est bon.

warvariuc
la source
10
Utiliser _pour contenir des valeurs temporaires est anti-modèle. Les variables de soulignement indiquent des valeurs non pertinentes / ignorées, et non une affectation temporaire, comme iou x. De plus, dans l'interpréteur, il a une signification particulière pour contenir la dernière valeur de la dernière expression.
James
121

Un peu plus de détails sur ce que gurney alex a noté: vous pouvez dire à PyLint de faire des exceptions pour les noms de variables qui (vous le jurez) sont parfaitement clairs même s'ils comportent moins de trois caractères. Recherchez ou ajoutez à votre fichier pylintrc , sous l'en- [FORMAT]tê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.

mlncn
la source
7
C'est la meilleure réponse.
giorgiosironi
1
Cela ne semble pas fonctionner pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James
2
Ce que j'aimerais vraiment, c'est que pylint accepte (sur demande) les vars courts lorsqu'ils sont utilisés dans les compréhensions. Comparez return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] vs return [a for a in thing.get_customer_addresses() if a.is_proper()] je prétends que ce dernier est plus clair, comme cela ressort clairement du contexte. En général, la longueur de la variable doit être en corrélation avec la portée de la variable.
EdvardM
21

Dans les langages fortement typés, 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 ces informations, donc si vous écrivez:

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

vous ne laissez absolument aucun indice à l'équipe de maintenance sur ce que la fonction pourrait faire, comment elle est appelée 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 fait le truc et quels types sont attendus.

gurney alex
la source
7
Au lieu de "langages compilés", j'écrirais "explicitement typé". Haskell, par exemple, est également compilé, mais vous pouvez écrire des déclarations implicites comme en Python.
Sebastian Mach
14
Bien que je sois d'accord avec vous dans ces cas, forcer 3 caractères ou plus dans un nom de variable ne signifie pas qu'il sera descriptif. J'utilise actuellement with open(FILE) as f: items = f.readlines()par exemple, où la variable fest vraiment évidente, mais j'obtiens des avertissements pylint. Cela m'a fait changer pour flake8.
Axel Örn Sigurðsson
3
vous pouvez également modifier les règles de pylint pour autoriser «f» un nom de variable. Il existe déjà des exceptions pour i, j AFAIR.
gurney alex
10
pour les gens qui ont rejeté cette réponse: je suis le type qui a introduit la règle dans Pylint, et la raison est exactement celle qui est donnée. Vous n'êtes peut-être pas d'accord avec cette décision, mais c'est quand même la réponse à la question ...
gurney alex
1
Je suis totalement votre raisonnement, mais souvent dans les algorithmes et la programmation mathématique, certaines valeurs sont généralement nommées avec une lettre. Je pense qu'une fonction appelée fest totalement différente d'une OptionListappelée c. Surtout quand je ne peux pas le renommer functioncar il masque un élément intégré.
kap
19

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

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

Donc, pylintcorrespondra à PEP8 et n'apportera pas de violations supplémentaires. Vous pouvez également l'ajouter à .pylintrc.

Jimilian
la source
3
Pour la version, > 1.8.3cela semble être la réponse. Peut mettre dans votre .pylintrcaussi bien pour config permanente: variable-rgx=[a-z0-9_]{1,30}$.
James
7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" peut être un peu plus approprié, "9" ne devrait pas être un nom de variable valide.
Eric Le Fort
16

La raison plus profonde est que vous souvenez peut - être ce que vous vouliez a, b, c, x, yet zà 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 lorsque vous donnez c'est un nom sémantique. Nous n'écrivons pas des trucs une fois sur un tableau pour ensuite les effacer. Nous écrivons du code qui pourrait rester une dizaine d'années ou plus, et être lu de nombreuses fois.

Utilisez des noms sémantiques. Les noms sémantiques que j'ai utilisés ont été comme ratio, denominator, obj_generator, path, etc. Il peut prendre une seconde ou deux pour les taper, mais le temps que vous gagnez à essayer de comprendre ce que vous avez écrit même une demi - heure à partir de là est bien la peine .

Salle Aaron
la source
7
Merci. Voici le code final - gist.github.com/amandabee/8969833 - Je vois votre point sur le code que je (ou vous) pouvez lire en un an, mais dans ce cas, je pense que x et y sont vraiment descriptifs.
Amanda