Tại sao pylint trả về `unubcriptable-object` cho numpy.ndarray.shape?


9

Tôi chỉ kết hợp trường hợp repro "tối thiểu" sau đây (tối thiểu trong dấu ngoặc kép vì tôi muốn đảm bảo pylintkhông có lỗi, cảnh báo, gợi ý hoặc đề xuất nào khác - có nghĩa là có một chút luồn lách):

pylint_error.py :

"""
Docstring
"""

import numpy as np


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


if __name__ == "__main__":
    main()

Khi tôi chạy pylintmã này ( pylint pylint_error.py) tôi nhận được đầu ra sau:

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

Nó tuyên bố rằng test.shapekhông thể đăng ký, mặc dù nó khá rõ ràng. Khi tôi chạy mã, nó hoạt động tốt:

$> python pylint_error.py
1

Vì vậy, những gì gây ra pylinttrở nên bối rối, và làm thế nào tôi có thể sửa chữa nó?

Một số lưu ý bổ sung:

  • Nếu tôi khai báo kiểm tra np.arange(1)thì lỗi sẽ biến mất
  • Nếu tôi tuyên bố thử nghiệm như np.zeros(1), np.zeros((1)), np.ones(1), hay np.ones((1))lỗi nào không đi
  • Nếu tôi khai báo kiểm tra np.full((1), 1)thì lỗi sẽ biến mất
  • Chỉ định loại ( test: np.ndarray = np.array([1])) không sửa lỗi
  • Chỉ định một dtype( np.array([1], dtype=np.uint8)) không sửa lỗi
  • Lấy một lát kiểm tra ( test[:].shape) làm cho lỗi biến mất

Bản năng đầu tiên của tôi nói rằng hành vi không nhất quán với các NumPYphương pháp khác nhau ( arangevs zerosvs full, v.v.) cho thấy đó chỉ là một lỗi trong NumPY. Tuy nhiên, có thể có một số khái niệm cơ bản cho NumPYrằng tôi đang hiểu lầm. Tôi muốn chắc chắn rằng tôi không viết mã với hành vi không xác định chỉ hoạt động tình cờ.


1
Tôi đã đổ lỗi pylinttrước đâynumpy
hpaulj

Câu trả lời:


5

Tôi không có đủ danh tiếng để bình luận, nhưng có vẻ như đây là một vấn đề mở: https://github.com/PyCQA/pylint/issues/3139

Cho đến khi vấn đề được giải quyết xong, tôi sẽ thay đổi dòng thành

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

vào pylintrctập tin của tôi


1
Cảm ơn đã liên kết vấn đề. Thật không may pylint cũng phàn nàn về các dòng quá dài, vì vậy tôi nghĩ rằng tôi có thể kiên quyết với print(test[:].shape[0])giải pháp của bạn vì nó làm cho các dòng của tôi ngắn hơn và cứu tôi khỏi pylintsự cằn nhằn không ngừng
stevendesu

2
LƯU Ý: Các phiên bản gần đây của pylint cảnh báo về việc vô hiệu hóa bằng ID, vì vậy tôi đề xuất một cái gì đó giống như thế này trên dòng trước:# pylint: disable=unsubscriptable-object # pylint/issues/3139
Bryce Schober

2

Kể từ tháng 11 năm 2019:

Như một trong những người dùng đã đề cập trong cuộc thảo luận về GitHub, bạn có thể giải quyết vấn đề bằng cách hạ cấp cả pylintastroid , ví dụ như trongrequirements.txt

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

hoặc là

pip install astroid==2.2.5 & pip install pylint==2.3.1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.