Pylint ungültiger Konstantenname

78

Ich erhalte einen Pylint-Fehler bezüglich meiner Konstante: MIN_SOIL_PARTICLE_DENS(ungültiger Name). Irgendwelche Ideen, warum diese Konstante falsch ist? Hier ist meine volle Funktion:

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
quelle

Antworten:

108

Bei der Überprüfung von Namen unterscheidet Pylint zwischen Konstanten, Variablen, Klassen usw. Jeder Name, der sich nicht in einer Funktion / Klasse befindet, wird als Konstante betrachtet, alles andere ist eine Variable.

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

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

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

Da Sie in einer Funktion sind, MIN_SOIL_PARTICLE_DENSdie (laut Pylint) eine Variable sein soll, behandelt Pylint sie jedoch als Konstante und beschwert sich daher.

Dies bedeutet, dass Sie keine Großbuchstaben in Funktionen haben können, ohne dass sich Pylint beschwert.


Wenn Sie mich fragen, ist die Verwendung von Großbuchstaben in Funktionen in Ordnung. Nicht alle Konstanten sind notwendigerweise global definiert.

Reiner Gerecke
quelle
7
Wenn es konstant ist, warum möchten Sie seinen Wert für jeden Aufruf dieser Methode neu zuweisen? Es könnte außerhalb dieser Methode definiert werden.
Maxime Chéramy
2
@Maxime Meine Idee ist es, die Methode unabhängig zu machen (ohne externe Konstanten zu benötigen), obwohl sie aufgrund der Neuzuweisung von Konstanten möglicherweise einen Leistungsverlust erfordert. Guter Punkt.
Gcamargo
@ user2457899 Eigentlich verwende ich in meinen Methoden auch Konstanten. Ich habe nur versucht, die Idee hinter dieser Pylint-Regel auszudrücken. :)
Maxime Chéramy
1
Ich weiß nicht, ich denke, ich hätte lieber Konstanten außerhalb von Funktionen. Wenn es nicht wirklich eine globale Konstante war, sollte es eine Variable sein.
Rick Henderson
@ MaximeChéramy Kannst du die Idee dahinter ausdrücken, warum func_name = make_func(1,2,3)dies als falsch angesehen werden könnte? Der aktuelle Anwendungsfall ist das vlen = numpy.vectorize(len)Utils-Modul für die Arbeit mit unregelmäßigen Arrays in h5py .
AnnanFay
1

Einige einfache Regeln:

  1. Konstanten sollten nur mit UPPER_CASEBuchstaben definiert und auf Modulebene definiert werden
  2. Klassennamen sollten mit CamelCaseBuchstaben definiert werden
  3. Variablen sollten bei definiert werden lower_caseund innerhalb von Funktionen, Klassen usw. definiert werden.

Lassen Sie uns nun über Ihren Fall sprechen,

MIN_SOIL_PARTICLE_DENSwird innerhalb einer Funktion definiert und sollte nur Kleinbuchstaben enthalten. Anstatt MIN_SOIL_PARTICLE_DENSals Konstante zu betrachten, betrachtet Pylint sie hier als Variable und damit als Pylint-Fehler.

Pylint Tutorial

Vishvajit Pathak
quelle
0

Ich fand dieses Verhalten ärgerlich, aber es gibt eine Möglichkeit, Pylint zu konfigurieren, um dies zu vermeiden!

Führen Sie die folgende Ini-Deklaration in Ihre .pylintrcDatei ein:

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

Ich habe diesen regulären Ausdruck durch Nehmen aufgebaut

und sie durch |und einige Klammern verbinden.

Theoretisch könnte man auch einfach nehmen .*, aber dies würde auch ungültige Namen wie erlauben mixed_CASE.

ComFreek
quelle