7

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

B.py:

class BaseClass(object):
    __metaclass__ = framework_meta # handles registration etc.

A.py:

import B
oldbase = B.BaseClass

人々がコードを移行するのを助けるために、フレームワークを使用するコードがプログラマーに直接継承するように指示するDeprecationWarningことから派生するクラスを定義するたびに、(warnings.warn を使用して)を発行できるようにしたいと考えています。A.oldbaseB.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。どうすればこれを修正できますか?

4

1 に答える 1

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)
于 2012-09-17T14:35:44.313 に答える