私は Python 2.x フレームワークを使用していますが、フレームワークの最近のバージョンでは、広く使用されているいくつかの基本クラスがモジュールからモジュールに移動A
さB
れました (その過程で、クラスの名前がより明確な名前に変更されました)。ModuleA
は、新しいクラス名の下位互換性のある識別子を定義します。
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
。どうすればこれを修正できますか?