ทำไมไพลินถึงส่งคืน `unsubscriptable-object` สำหรับ 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])มากกว่าการแก้ปัญหาของคุณตั้งแต่มันทำให้ฉันสายสั้นและช่วยฉันจากpylints ไม่หยุดหย่อนจู้จี้
stevendesu

2
หมายเหตุ: pylint รุ่นล่าสุดเตือนเกี่ยวกับการปิดใช้งานโดย ID ดังนั้นฉันขอแนะนำบางอย่างเช่นนี้ในบรรทัดก่อนหน้า:# pylint: disable=unsubscriptable-object # pylint/issues/3139
Bryce Schober

2

ณ วันที่พฤศจิกายน 2019:

ดังกล่าวโดยหนึ่งในผู้ใช้ในการสนทนาบนGitHubคุณสามารถแก้ไขปัญหาโดยการลดระดับทั้ง pylintและastroidเช่นใน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.