में एक क्लासिक क्लास के रूप में कक्षा के उपयोग को अस्वीकार करें, मैं एक पायथन 2.x फ्रेमवर्क के साथ काम कर रहा हूं, और ढांचे के हाल के संस्करण ने मॉड्यूल A
से मॉड्यूल B
(और कक्षाओं) में कुछ व्यापक रूप से उपयोग किए जाने वाले बेस क्लास को स्थानांतरित कर दिया है प्रक्रिया में एक स्पष्ट नाम का नाम बदल दिया गया है)। मॉड्यूल A
नए वर्ग के नामों के लिए पिछड़े संगत पहचानकर्ताओं को परिभाषित करता है।पायथन
B.py:
class BaseClass(object):
__metaclass__ = framework_meta # handles registration etc.
A.py:
import B
oldbase = B.BaseClass
अब मदद करने के लिए लोगों को अपने कोड की ओर पलायन में, मैं एक DeprecationWarning
(चेतावनी का उपयोग कर जारी करने के लिए सक्षम होने के लिए करना चाहते हैं। चेतावनी दें) जब भी ढांचे का उपयोग करने वाला कोड A.oldbase
से प्राप्त कक्षा को परिभाषित करता है, तो प्रोग्रामर को B.BaseClass
से सीधे प्राप्त करने के लिए कहता है।
मुझे उम्मीद है कि यह मेटाक्लास के साथ हासिल किया जा सकता है।
A.py:
class oldbase(B.BaseClass):
__metaclass__ = deprecated_base_class
__deprecation_warning__ = 'class oldbase is deprecated. Use B.BaseClass instead'
clientcode.py
class FooBar(oldbase):
pass
समस्या मैं
मैं एक नया metaclass साथ
class deprecated_base_class(framework_meta):
def __new__(meta, name, bases, attrs):
warning = '%(class)s is deprecated'
for b in bases:
warning = getattr(b, '__deprecation_warning__', None) or warning
warn(warning % {'class': name}, DeprecationWarning, stacklevel=2)
return super(deprecated_base_class, meta).__new__(meta, name, bases, attrs)
एक साथ ढांचा metaclass से पाने घोषित करने की कोशिश अब है, मुझे oldbase
की परिभाषा के लिए DeprecationWarning
मिलता है। मैं इसे कैसे ठीक करूं?