2016-08-09 5 views
8

तो मैं अजगर में एक साधारण कस्टम त्रुटि वर्ग है कि मैं अजगर 2.7 प्रलेखन के आधार पर बनाया है:पायथन में कस्टम त्रुटि कक्षाओं में सुपर कॉल करने का क्या मतलब है?

class InvalidTeamError(Exception): 
    def __init__(self, message='This user belongs to a different team'): 
     self.message = message 

इससे मुझे PyLint में W0231: __init__ method from base class %r is not called चेतावनी तो मैं उसे ढूंढने जाने के लिए और के लिए बहुत उपयोगी विवरण दिया हूँ "स्पष्टीकरण की आवश्यकता है।" मैं आमतौर पर केवल इस त्रुटि को अनदेखा करता हूं लेकिन मैंने देखा है कि की शुरुआत में कस्टम त्रुटि वर्गों की विधि में एक टन कोड ऑनलाइन में सुपर कॉल शामिल है, इसलिए मेरा प्रश्न है: क्या यह वास्तव में एक उद्देश्य प्रदान करता है या यह है बस लोग एक फर्जी पिलिंट चेतावनी को खुश करने की कोशिश कर रहे हैं?

उत्तर

10

यह एक मान्य पिलिंट चेतावनी थी: सुपरक्लास __init__ का उपयोग न करके आप मूल वर्ग में कार्यान्वयन में बदलाव से चूक सकते हैं। और, वास्तव में, आपके पास है - क्योंकि BaseException.message को पायथन 2.6 के रूप में बहिष्कृत कर दिया गया है।

यहां एक कार्यान्वयन होगा जो आपकी चेतावनी W0231 से बच जाएगा और message विशेषता के बारे में पाइथन की बहिष्करण चेतावनी से भी बच जाएगा।

class InvalidTeamError(Exception): 
    def __init__(self, message='This user belongs to a different team'): 
     super(InvalidTeamError, self).__init__(message) 

यह यह करने के लिए एक बेहतर तरीका है, क्योंकि implementation for BaseException.__str__ केवल 'आर्ग' टपल समझता है, यह बिल्कुल संदेश पर गौर नहीं करता। आपके पुराने कार्यान्वयन के साथ, print InvalidTeamError() ने केवल एक खाली स्ट्रिंग मुद्रित की होगी, जो शायद आप नहीं चाहते थे!

+0

सी कार्यान्वयन से जोड़ने के लिए विशाल अंगूठे। यह तुरंत स्पष्ट करता है, क्या चल रहा है! – timmwagener

-1

cpython2.7 स्रोत कोड को Lookinv वहाँ सुपर init करने के लिए कि कॉल से बचने के कोई समस्या नहीं होनी चाहिए और हाँ, यह सिर्फ इसलिए कि अपने init में आधार वर्ग init कॉल करने के लिए अपने आम तौर पर एक अच्छा अभ्यास किया है।

https://github.com/python/cpython/blob/master/Objects/exceptions.c बेसएक्सप्शन इनिट और लाइन 456 के लिए लाइन 60 देखें बेस अपवाद से अपवाद कैसे प्राप्त होता है।

संबंधित मुद्दे