Właśnie stworzyłem następujący przypadek „minimalnego” repro (minimum w cudzysłowie, ponieważ chciałem mieć pewność, że pylint
nie rzucę żadnych innych błędów, ostrzeżeń, podpowiedzi ani sugestii - co oznacza, że jest trochę płyty kotłowej):
pylint_error.py :
"""
Docstring
"""
import numpy as np
def main():
"""
Main entrypoint
"""
test = np.array([1])
print(test.shape[0])
if __name__ == "__main__":
main()
Po uruchomieniu pylint
tego kodu ( pylint pylint_error.py
) otrzymuję następujące dane wyjściowe:
$> 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)
Twierdzi, że test.shape
nie można go subskrybować, nawet jeśli jest to całkiem jasne. Po uruchomieniu kodu działa dobrze:
$> python pylint_error.py
1
Co powoduje pylint
dezorientację i jak mogę to naprawić?
Kilka dodatkowych uwag:
- Jeśli zadeklaruję test, ponieważ
np.arange(1)
błąd zniknie - Jeśli oświadczam testu jako
np.zeros(1)
,np.zeros((1))
,np.ones(1)
, czynp.ones((1))
błąd ma nie odejdzie - Jeśli zadeklaruję test, ponieważ
np.full((1), 1)
błąd zniknie - Podanie type (
test: np.ndarray = np.array([1])
) nie naprawia błędu - Określanie
dtype
(np.array([1], dtype=np.uint8)
) nie naprawia błędu - Wykonanie testu (
test[:].shape
) powoduje, że błąd zniknie
Mój pierwszy instynkt mówi, że niespójne zachowanie z różnymi NumPY
metodami ( arange
vs zeros
vs full
itp.) Sugeruje, że to tylko błąd NumPY
. Jednak możliwe jest, że istnieje pewne podstawowe pojęcie, NumPY
że nie rozumiem. Chciałbym mieć pewność, że nie piszę kodu o nieokreślonym zachowaniu, które działa tylko na wypadek.
pylint
przednumpy
Odpowiedzi:
Nie mam wystarczającej reputacji, by móc komentować, ale wygląda na to, że jest to otwarty problem: https://github.com/PyCQA/pylint/issues/3139
Dopóki problem nie zostanie rozwiązany na ich końcu, po prostu zmienię linię na
do mojego
pylintrc
pliku.źródło
pylint
również na zbyt długie linie, więc myślę, że mogę się trzymaćprint(test[:].shape[0])
twojego rozwiązania, ponieważ sprawia, że moje linie są krótsze i ratują mnie odpylint
# pylint: disable=unsubscriptable-object # pylint/issues/3139
Od listopada 2019 r .:
Jak wspomniał jeden z użytkowników w dyskusji na GitHubie, możesz rozwiązać problem, obniżając zarówno pylint, jak i astroid , np.
requirements.txt
lub
źródło