Acabei de montar o seguinte caso "mínimo" de reprodução (mínimo entre aspas porque queria garantir pylint
não lançasse outros erros, avisos, dicas ou sugestões - o que significa que há um pouco de clichê):
pylint_error.py :
"""
Docstring
"""
import numpy as np
def main():
"""
Main entrypoint
"""
test = np.array([1])
print(test.shape[0])
if __name__ == "__main__":
main()
Quando executo pylint
esse código ( pylint pylint_error.py
), recebo a seguinte saída:
$> 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)
Alega que test.shape
não é subscrito, mesmo que seja claramente. Quando executo o código, ele funciona bem:
$> python pylint_error.py
1
Então, o que está causando pylint
confusão, e como posso corrigi-lo?
Algumas notas adicionais:
- Se eu declarar teste como
np.arange(1)
o erro desaparece - Se eu declarar teste como
np.zeros(1)
,np.zeros((1))
,np.ones(1)
, ounp.ones((1))
o erro que não vão embora - Se eu declarar teste como
np.full((1), 1)
o erro desaparece - A especificação do tipo (
test: np.ndarray = np.array([1])
) não corrige o erro - A especificação de um
dtype
(np.array([1], dtype=np.uint8)
) não corrige o erro - Fazer uma fatia do teste (
test[:].shape
) faz com que o erro desapareça
Meu primeiro instinto diz que o comportamento inconsistente com vários NumPY
métodos ( arange
vs zeros
vs full
, etc) sugere que é apenas um bug NumPY
. No entanto, é possível que exista algum conceito subjacente ao NumPY
qual estou entendendo mal. Eu gostaria de ter certeza de que não estou escrevendo código com comportamento indefinido que está funcionando apenas por acidente.
pylint
antesnumpy