Pylint nombre constante inválido

78

Recibo un error de Pylint con respecto a mi constante: MIN_SOIL_PARTICLE_DENS(nombre no válido). ¿Alguna idea de por qué esta constante está mal? Aquí está mi función completa:

def bulk_density(clay, sand, organic_matter):
    MIN_SOIL_PARTICLE_DENS = 2.65
    x1 = (0.078 + 0.278 * sand + 0.034 * clay + 0.022 * organic_matter - 0.018
          * sand * organic_matter - 0.027 * clay * organic_matter - 0.584 * sand
          * clay)
    x2 = -0.107 + 1.636 * x1
    field_capacity = vol_water_content_33_j_kg(clay, sand, organic_matter)#m3/m3
    sat_water_content = 0.043 + field_capacity + x2 - 0.097 * sand
    return (1 - sat_water_content) * MIN_SOIL_PARTICLE_DENS
gcamargo
fuente

Respuestas:

108

Al verificar los nombres, Pylint diferencia entre constantes, variables, clases, etc. Cualquier nombre que no esté dentro de una función / clase se considerará una constante, cualquier otra cosa es una variable.

Ver http://docs.pylint.org/features.html#basic-checker

variable-rgx:
[a-z_][a-z0-9_]{2,30}$

const-rgx:
(([A-Z_][A-Z0-9_]*)|(__.*__))$

Debido a que está en una función, se MIN_SOIL_PARTICLE_DENSsupone que (según pylint) es una variable, pylint, sin embargo, la trata como una constante y, por lo tanto, se queja.

Esto significa que no puede tener nombres en mayúsculas dentro de las funciones sin que pylint se queje.


Si me preguntas, usar funciones internas en mayúsculas está bien; no todas las constantes están necesariamente definidas globalmente.

Reiner Gerecke
fuente
7
Si es constante, ¿por qué desea reasignar su valor para cada llamada a este método? Podría definirse fuera de este método.
Maxime Chéramy
2
@Maxime, mi idea es tener el método independiente (sin necesidad de constantes externas), aunque puede ser un problema de rendimiento debido a la reasignación de constantes. Aunque es un buen punto.
gcamargo
@ user2457899 En realidad, también uso constantes en mis métodos. Solo estaba tratando de expresar la idea detrás de esta regla de pilotaje. :)
Maxime Chéramy
1
No lo sé, creo que prefiero tener constantes fuera de las funciones. Si no fuera realmente una constante global, debería ser una variable.
Rick Henderson
@ MaximeChéramy ¿Puede expresar la idea detrás de por qué func_name = make_func(1,2,3)podría considerarse incorrecto? El caso de uso actual está vlen = numpy.vectorize(len)en el módulo utils para trabajar con matrices irregulares en h5py .
AnnanFay
1

Pocas reglas simples:

  1. Las constantes deben definirse UPPER_CASEsolo con letras y deben definirse a nivel de módulo
  2. Los nombres de las clases deben definirse con CamelCaseletras
  3. Las variables deben definirse en lower_casey deben definirse dentro de la función, clases, etc.

Ahora hablemos de tu caso

MIN_SOIL_PARTICLE_DENSse define dentro de una función y solo debe tener letras minúsculas. Por lo tanto, en lugar de considerarlo MIN_SOIL_PARTICLE_DENScomo una constante, pylint lo considera como una variable aquí y por lo tanto el error de pylint.

Tutorial de Pylint

Vishvajit Pathak
fuente
0

Encontré este comportamiento molesto, ¡pero hay una manera de configurar pylint para evitarlo!

Fusiona la siguiente declaración de estilo ini en tu .pylintrcarchivo:

[BASIC]
variable-rgx=((([a-z_][a-z0-9_]{2,})|(_[a-z0-9_]*)|(__[a-z][a-z0-9_]+__))$)|([A-Z_][A-Z0-9_]+$)

Construí esta expresión regular tomando

y uniéndolos con |y algunos paréntesis.

Teóricamente, también podría simplemente tomar .*, pero esto permitiría incluso nombres no válidos como mixed_CASE.

ComFreek
fuente