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 pylintesse 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.shapenã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 pylintconfusã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 NumPYmétodos ( arangevs zerosvs full, etc) sugere que é apenas um bug NumPY. No entanto, é possível que exista algum conceito subjacente ao NumPYqual 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.
pylintantesnumpy