2012-09-17 4 views
7

में एक क्लासिक क्लास के रूप में कक्षा के उपयोग को अस्वीकार करें, मैं एक पायथन 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 मिलता है। मैं इसे कैसे ठीक करूं?

उत्तर

2

आप अगर अड्डों में से किसी का बहिष्कार कर रहे हैं चेतावनी प्रदर्शित करना चाहते हैं:

class deprecated_base_class(framework_meta): 
    def __new__(meta, name, bases, attrs): 
     for b in bases: 
      if isinstance(b, deprecated_base_class): 
       warning = getattr(b, '__deprecation_warning__', '%(class)s is deprecated') 
       warn(warning % {'class': b.__name__}, DeprecationWarning, stacklevel=2) 
     return super(deprecated_base_class, meta).__new__(meta, name, bases, attrs)