¿Por qué pylint se opone a los nombres de variables de un solo carácter?

96

Todavía me estoy acostumbrando a las convenciones de Python y las uso pylintpara hacer mi código más pitónico, pero estoy desconcertado por el hecho de que a pylint no le gustan los nombres de variables de un solo carácter. Tengo algunos bucles como este:

for x in x_values:
   my_list.append(x)

y cuando ejecuto pylint, obtengo Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}, eso sugiere que un nombre de variable válido debe tener entre 3 y 31 caracteres de longitud, pero he revisado las convenciones de nomenclatura de PEP8 y no veo nada explícito con respecto a letras minúsculas individuales , y veo muchos ejemplos que los usan.

¿Hay algo que me falta en PEP8 o es un estándar exclusivo de pylint?

Amanda
fuente

Respuestas:

47

PyLint comprueba no solo las recomendaciones de PEP8. También tiene sus propias recomendaciones, una de las cuales es que el nombre de una variable debe ser descriptivo y no demasiado corto.

Puede usar esto para evitar nombres tan cortos:

my_list.extend(x_values)

O modifique la configuración de PyLint para decirle a PyLint qué nombre de variable es bueno.

warvariuc
fuente
10
Usar _para mantener valores temporales es un antipatrón. Las variables de subrayado indican valores irrelevantes / descartados, no asignaciones temporales, como io x. Además, en el intérprete tiene un significado especial mantener el último valor de la última expresión.
James
121

Un poco más de detalle sobre lo que gurney alex notó: puede decirle a PyLint que haga excepciones para los nombres de variables que (juro con el dedo meñique) son perfectamente claros aunque tengan menos de tres caracteres. Busque o agregue a su archivo pylintrc , debajo del [FORMAT]encabezado:

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

Aquí pk (para clave principal), xey son nombres de variables que he agregado.

mlncn
fuente
7
Esta es la mejor respuesta.
giorgiosironi
1
No parece funcionar pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James
2
Lo que realmente me gustaría es que pylint acepte (a pedido) vars cortas cuando se usan en comprensiones. Compare return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] versus return [a for a in thing.get_customer_addresses() if a.is_proper()] yo afirmo que este último es más claro, como es obvio por el contexto. En general, la longitud de la variable debe correlacionarse con el alcance de la variable.
EdvardM
21

En lenguajes fuertemente tipados, las variables de nombre de 1 letra pueden estar bien, porque generalmente obtienes el tipo junto al nombre en la declaración de la variable o en el prototipo de función / método:

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

En Python, no obtienes esta información, así que si escribes:

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

no le está dejando absolutamente ninguna pista al equipo de mantenimiento sobre lo que podría estar haciendo la función, cómo se llama y qué devuelve. Entonces, en Python, tiende a usar nombres descriptivos:

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

e incluso agrega una cadena de documentos que explica qué hacen las cosas y qué tipos se esperan.

camilla alex
fuente
7
En lugar de "lenguajes compilados", escribiría "tipado explícitamente". Haskell, por ejemplo, también está compilado, pero puedes escribir declaraciones implícitas como en Python.
Sebastian Mach
14
Si bien estoy de acuerdo con usted en estos casos, forzar 3 o más caracteres en un nombre de variable no significa que será descriptivo. Actualmente estoy usando, with open(FILE) as f: items = f.readlines()por ejemplo, donde la variable fes realmente obvia, pero recibo advertencias de pylint. Esto me hizo cambiar a flake8.
Axel Örn Sigurðsson
3
también puede cambiar las reglas de pylint para permitir 'f' un nombre de variable. Ya existen excepciones para i, j AFAIR.
camilla alex
10
para las personas que votaron en contra de esta respuesta: soy el tipo que introdujo la regla en Pylint, y la razón es exactamente la que se da. Puede que no esté de acuerdo con esta decisión, pero esta es, sin embargo, la respuesta a la pregunta ...
camilla alex
1
Sigo totalmente su razonamiento, sin embargo, a menudo, en algoritmos y programación matemática, algunos valores generalmente se nombran con una letra. Creo que una función llamada fes totalmente diferente a una OptionListllamada c. Especialmente cuando no puedo cambiarle el nombre a functionporque oculta un archivo.
kap
19

Hoy en día también existe una opción para anular regexp. Es decir, si desea permitir caracteres individuales como variables:

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

Por lo tanto, pylintcoincidirá con PEP8 y no traerá violaciones adicionales en la parte superior. También puedes agregarlo a .pylintrc.

Jimilian
fuente
3
Para la versión, > 1.8.3esta parece ser la respuesta. Puede poner esto en su .pylintrc, así como para config permanente: variable-rgx=[a-z0-9_]{1,30}$.
James
7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" puede ser un poco más apropiado, "9" no debería ser un nombre de variable válido.
Eric Le Fort
16

La razón más profunda es que usted puede recordar lo que pretende a, b, c, x, y, y zpara decir cuando escribió su código, pero cuando otros leen, o incluso cuando regresan a su código, el código se vuelve mucho más fácil de leer cuando das es un nombre semántico. No escribimos cosas una vez en una pizarra y luego las borramos. Estamos escribiendo un código que podría durar una década o más y que se leerá muchas, muchas veces.

Utilice nombres semánticos. Nombres semánticas que he usado han sido como ratio, denominator, obj_generator, path, etc. Se puede tomar un segundo extra o dos para escribir a cabo, pero el tiempo que se ahorra tratando de averiguar lo que ha escrito ni media hora a partir de entonces es bien vale la pena .

Aaron Hall
fuente
7
Gracias. Aquí está el código final - gist.github.com/amandabee/8969833 - Veo su punto sobre el código que yo (o usted) podemos leer en un año, pero en este caso, creo que xey son genuinamente descriptivos.
Amanda