Je viens de rassembler le cas de repro "minimum" suivant (minimum entre guillemets parce que je voulais m'assurer qu'il pylint
n'y avait pas d'autres erreurs, avertissements, conseils ou suggestions - ce qui signifie qu'il y a un peu de passe-partout):
pylint_error.py :
"""
Docstring
"""
import numpy as np
def main():
"""
Main entrypoint
"""
test = np.array([1])
print(test.shape[0])
if __name__ == "__main__":
main()
Lorsque je lance pylint
sur ce code ( pylint pylint_error.py
), j'obtiens la sortie suivante:
$> 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)
Il prétend que ce test.shape
n'est pas indicable, même s'il l'est très clairement. Lorsque j'exécute le code, cela fonctionne très bien:
$> python pylint_error.py
1
Alors, qu'est-ce qui cause la pylint
confusion et comment puis-je y remédier?
Quelques notes supplémentaires:
- Si je déclare le test alors que
np.arange(1)
l'erreur disparaît - Si je déclare test
np.zeros(1)
,np.zeros((1))
,np.ones(1)
ounp.ones((1))
l'erreur ne pas disparaître - Si je déclare le test alors que
np.full((1), 1)
l'erreur disparaît - La spécification du type (
test: np.ndarray = np.array([1])
) ne résout pas l'erreur - La spécification d'un
dtype
(np.array([1], dtype=np.uint8)
) ne résout pas l'erreur - Prendre une tranche de test (
test[:].shape
) fait disparaître l'erreur
Mon premier instinct dit que le comportement incohérent avec diverses NumPY
méthodes ( arange
vs zeros
vs full
, etc.) suggère que ce n'est qu'un bug NumPY
. Cependant, il est possible qu'il y ait un concept sous-jacent à ce NumPY
que je comprends mal. Je voudrais être sûr que je n'écris pas du code avec un comportement indéfini qui ne fonctionne que par accident.
pylint
avantnumpy