¿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?

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.


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.


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.


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.


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 .


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.