Ich habe gerade den folgenden "minimalen" Repro-Fall zusammengestellt (Minimum in Anführungszeichen, weil ich sicherstellen wollte, dass pylint
keine anderen Fehler, Warnungen, Hinweise oder Vorschläge ausgegeben wurden - was bedeutet, dass es ein bisschen Boilerplate gibt):
pylint_error.py :
"""
Docstring
"""
import numpy as np
def main():
"""
Main entrypoint
"""
test = np.array([1])
print(test.shape[0])
if __name__ == "__main__":
main()
Wenn ich pylint
diesen Code ( pylint pylint_error.py
) ausführe, erhalte ich die folgende Ausgabe:
$> pylint pylint_error.py
************* Module pylint_error
pylint_error.py:13:10: E1136: Value 'test.shape' is unsubscriptable (unsubscriptable-object)
------------------------------------------------------------------
Your code has been rated at 1.67/10 (previous run: 1.67/10, +0.00)
Es wird behauptet, dass dies test.shape
nicht abonnierbar ist, obwohl es ganz klar ist. Wenn ich den Code ausführe, funktioniert es einwandfrei:
$> python pylint_error.py
1
Was führt also pylint
zu Verwirrung und wie kann ich das beheben?
Einige zusätzliche Hinweise:
- Wenn ich den Test deklariere, verschwindet
np.arange(1)
der Fehler - Wenn ich Test erklären , wie
np.zeros(1)
,np.zeros((1))
,np.ones(1)
odernp.ones((1))
der Fehler nicht nicht weggehen - Wenn ich den Test deklariere, verschwindet
np.full((1), 1)
der Fehler - Die Angabe der Art (
test: np.ndarray = np.array([1])
) nicht nicht beheben den Fehler - Die Angabe eines
dtype
(np.array([1], dtype=np.uint8)
) nicht nicht den Fehler beheben - Wenn Sie ein Stück test (
test[:].shape
) nehmen, verschwindet der Fehler
Mein erster Instinkt besagt, dass das inkonsistente Verhalten mit verschiedenen NumPY
Methoden ( arange
vs zeros
vs full
usw.) darauf hindeutet, dass es sich nur um einen Fehler handelt NumPY
. Es ist jedoch möglich, NumPY
dass ich ein Missverständnis habe. Ich möchte sichergehen, dass ich keinen Code mit undefiniertem Verhalten schreibe, der nur bei Unfällen funktioniert.
pylint
vorher beschuldigennumpy
Antworten:
Ich habe nicht genug Ruf, um einen Kommentar abzugeben, aber es sieht so aus, als wäre dies ein offenes Problem: https://github.com/PyCQA/pylint/issues/3139
Bis das Problem am Ende behoben ist, würde ich einfach die Zeile in ändern
zu meiner
pylintrc
Datei.quelle
pylint
auch beschwert sich über Leitungen zu lang ist, so glaube ich , mit Stick kannprint(test[:].shape[0])
über Ihre Lösung , da sie kürzer meine Linien macht und erspart mirpylint
s quälende unaufhörlichen# pylint: disable=unsubscriptable-object # pylint/issues/3139
Stand November 2019:
Wie durch einen der Benutzer in der Diskussion über die genannten GitHub könnten Sie das Problem durch die Herabstufung lösen sowohl Pylint und astroid , zB in
requirements.txt
oder
quelle