मैंने एक पाइथन कक्षा का नाम बदल दिया है जो लाइब्रेरी का हिस्सा है। मैं कुछ समय के लिए अपने पिछले नाम का उपयोग करने की संभावना छोड़ने के लिए तैयार हूं लेकिन उपयोगकर्ता को चेतावनी देना चाहता हूं कि इसे बहिष्कृत किया गया है और भविष्य में हटा दिया जाएगा।वर्ग (नाम) बहिष्करण के बारे में चेतावनी कैसे दें
मुझे लगता है कि पिछली संगतता प्रदान करने के लिए ऐसा एक अन्य नाम का उपयोग करने के लिए पर्याप्त होगा:
class NewClsName:
pass
OldClsName = NewClsName
मैं पता नहीं कैसे OldClsName
चिह्नित करने के लिए के रूप में एक सुरुचिपूर्ण ढंग से बहिष्कृत कर दिया गया है। हो सकता है कि मैं OldClsName
एक ऐसा फ़ंक्शन बना सकता हूं जो एक चेतावनी (लॉग करने के लिए) उत्सर्जित करता है और NewClsName
ऑब्जेक्ट को इसके पैरामीटर से बना देता है (*args
और **kvargs
का उपयोग करके) लेकिन यह पर्याप्त सुरुचिपूर्ण प्रतीत नहीं होता है (या शायद यह है?)।
हालांकि, मुझे नहीं पता कि पाइथन मानक लाइब्रेरी बहिष्करण चेतावनियां कैसे काम करती हैं। मुझे लगता है कि बहिष्कार से निपटने के लिए कुछ अच्छा जादू हो सकता है, उदा। कुछ दुभाषिया के कमांड लाइन विकल्प के आधार पर इसे त्रुटियों या सिलेंसिंग के रूप में इलाज करने की अनुमति देता है।
सवाल यह है: उपयोगकर्ताओं को एक अप्रचलित वर्ग उपनाम (या सामान्य रूप से अप्रचलित कक्षा) का उपयोग करने के बारे में चेतावनी कैसे दें।
संपादित: समारोह दृष्टिकोण मेरे लिए काम नहीं करता है क्योंकि वर्ग कुछ वर्ग विधियों (कारखाना विधि) जो जब OldClsName
एक समारोह के रूप में परिभाषित किया गया नहीं कहा जा सकता है (मैं पहले से ही यह एक कोशिश दे दी है) । निम्नलिखित कोड काम नहीं करेगा:
class NewClsName(object):
@classmethod
def CreateVariant1(cls, ...):
pass
@classmethod
def CreateVariant2(cls, ...):
pass
def OldClsName(*args, **kwargs):
warnings.warn("The 'OldClsName' class was renamed [...]",
DeprecationWarning)
return NewClsName(*args, **kwargs)
OldClsName.CreateVariant1(...)
के कारण:
AttributeError: 'function' object has no attribute 'CreateVariant1'
मेरी एकमात्र विकल्प विरासत है? ईमानदार होने के लिए, यह मेरे लिए बहुत साफ नहीं दिखता है - यह अनावश्यक व्युत्पन्न के परिचय के माध्यम से कक्षा पदानुक्रम को प्रभावित करता है। इसके अतिरिक्त, OldClsName is not NewClsName
अधिकांश मामलों में कोई समस्या नहीं है लेकिन लाइब्रेरी का उपयोग करके खराब लिखित कोड के मामले में समस्या हो सकती है।
मैं एक डमी, असंबद्ध OldClsName
कक्षा भी बना सकता हूं और इसमें सभी वर्ग विधियों के लिए एक कन्स्ट्रक्टर के साथ ही रैपर लागू कर सकता हूं, लेकिन यह मेरी राय में भी खराब समाधान है।
विरासत सहायक आसान रूप में अच्छी तरह से किया जाना चाहिए - बस एक 'वर्ग OldClsName (NewClsName बारे में): # और अधिभार __new__'। – delnan
+1 यह पुष्टि करने के लिए कि इस समाधान का उपयोग किया गया है और 'चेतावनियों' मॉड्यूल का उल्लेख करने के लिए। दुर्भाग्यवश फ़ंक्शन समाधान मेरे लिए काम नहीं करता है (संपादित प्रश्न देखें)। शायद आपके पास कुछ और साफ समाधान हैं? : डी –
एक रैपर ऑब्जेक्ट का उपयोग करने के उदाहरण के साथ अपडेट किया गया है जो कॉल और विशेषता दोनों को प्रॉक्सी कर सकता है नई कक्षा तक पहुंच। – AdamKG