我正在使用Python 2.x框架,并且该框架的最新版本已将一些广泛使用的基类从模块A
移动到模块B
(并且这些类已被重命名在过程中更清晰的名称)。模块A
为新类名定义了向后兼容的标识符。
B.py:
class BaseClass(object):
__metaclass__ = framework_meta # handles registration etc.
A.py:
import B
oldbase = B.BaseClass
现在,为了帮助人们迁移他们的代码,我希望能够发出DeprecationWarning
(使用warnings.warn),只要使用框架的代码定义了一个派生自A.oldbase
的类,告诉他们程序员直接从B.BaseClass
继承。
我希望这可以通过元类来实现。我试图声明一个从框架元类
派生的新元类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)
与:
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
我现在遇到的问题是DeprecationWarning
定义了oldbase
。我该如何解决这个问题?
答案 0 :(得分: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)