pylint가 numpy.ndarray.shape에 대해 '첨자 불가능 객체'를 반환하는 이유는 무엇입니까?


9

방금 다음과 같은 "최소한"재현 사례를 정리했습니다 ( pylint다른 오류, 경고, 힌트 또는 제안을 던지지 않기 위해 인용 부호가 최소화되었으므로 약간의 상용구가 있음).

pylint_error.py :

"""
Docstring
"""

import numpy as np


def main():
    """
    Main entrypoint
    """
    test = np.array([1])
    print(test.shape[0])


if __name__ == "__main__":
    main()

pylint이 코드 ( pylint pylint_error.py)를 실행 하면 다음과 같은 결과가 나타납니다.

$> 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)

그것은 test.shape분명히 명확하더라도 첨자 할 수 없다고 주장합니다 . 코드를 실행하면 정상적으로 작동합니다.

$> python pylint_error.py
1

무엇이 pylint혼란스러워지고 어떻게 고칠 수 있습니까?

몇 가지 추가 사항 :

  • np.arange(1)오류가 사라질 때 테스트를 선언하면
  • 내가 테스트로 선언하면 np.zeros(1), np.zeros((1)), np.ones(1), 또는 np.ones((1))오류가 않습니다 하지 멀리 이동
  • np.full((1), 1)오류가 사라질 때 테스트를 선언하면
  • 유형 ( test: np.ndarray = np.array([1]))을 지정해도 오류가 해결 되지 않습니다
  • dtype( np.array([1], dtype=np.uint8))를 지정해도 오류가 해결 되지 않습니다
  • 테스트 한 조각 ( test[:].shape)을 수행하면 오류가 사라집니다.

첫 번째 본능에 따르면 다양한 NumPY방법 ( arangevs zerosvs full등) 의 일관되지 않은 동작으로 인해 버그가 있음을 알 수 NumPY있습니다. 그러나 NumPY내가 오해한다는 기본 개념이있을 수 있습니다 . 우연히 작동하는 정의되지 않은 동작으로 코드를 작성하지 않도록하고 싶습니다.


1
나는 pylint전에 비난 했다numpy
hpaulj

답변:


5

의견을 말할만큼 평판이 좋지 않지만 공개 문제 인 것 같습니다 : https://github.com/PyCQA/pylint/issues/3139

문제가 끝날 때까지 줄을 다음과 같이 변경합니다.

    print(test.shape[0])  # pylint: disable=E1136  # pylint/issues/3139

pylintrc파일에.


1
문제를 연결해 주셔서 감사합니다. 불행히도 pylint 또한 내가 스틱 것 같아요, 그래서 라인이 너무 긴 것에 대해 불만을 print(test[:].shape[0])내 줄 짧은하게하기 때문에 솔루션을 통해과에서 저를 저장 pylint들 잔소리 끊임
stevendesu

2
참고 : 최신 버전의 pylint는 ID로 비활성화하는 것에 대해 경고하므로 다음 줄에서 다음과 같은 내용을 권장합니다.# pylint: disable=unsubscriptable-object # pylint/issues/3139
Bryce Schober

2

2019 년 11 월 기준 :

GitHub 에 대한 토론에서 사용자 중 한 명이 언급했듯이 pylintastroid를 모두 다운 그레이드하여 문제를 해결할 수 있습니다 .requirements.txt

astroid>=2.0, <2.3
pylint>=2.3, <2.4

또는

pip install astroid==2.2.5 & pip install pylint==2.3.1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.