क्यों pylint numpy.ndarray.shape के लिए `unsubscriptable-object` लौटाता है?


10

मैंने केवल निम्नलिखित "न्यूनतम" रिप्रो केस (उद्धरणों में न्यूनतम क्योंकि मैंने यह सुनिश्चित करना चाहा था कि 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])) त्रुटि को ठीक नहीं करता है
  • A dtype( np.array([1], dtype=np.uint8)) निर्दिष्ट करना त्रुटि को ठीक नहीं करता है
  • परीक्षण का टुकड़ा ( test[:].shape) लेने से त्रुटि दूर हो जाती है

मेरी पहली वृत्ति कहती है कि विभिन्न NumPYतरीकों ( arangeबनाम zerosबनाम 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
टिक

2
नोट: पाइलिंट के हाल के संस्करणों ने आईडी द्वारा अक्षम करने के बारे में चेतावनी दी है, इसलिए मैं पूर्ववर्ती पंक्ति पर कुछ इस तरह की सलाह देता हूं:# pylint: disable=unsubscriptable-object # pylint/issues/3139
ब्रायस शॉबर

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.