私はライブラリの一部であるpythonクラスの名前を変更しました。私は以前の名前をしばらく使用する可能性を残しておきたいが、それが非難され、将来削除されることをユーザーに警告したい。クラス(名前)の廃止についての警告方法
私はそのようにエイリアスを使用するのに十分だろう、下位互換性を提供することを考える:
class NewClsName:
pass
OldClsName = NewClsName
私はエレガントな方法で非推奨とOldClsName
をマークする方法は考えています。たぶん私はOldClsName
(ログに)警告を発し、NewClsName
オブジェクトをそのパラメータ(*args
と**kvargs
を使用)から構築する関数を作ることができるかもしれませんが、それは十分にエレガントではありませんか?
しかし、私はPython標準ライブラリの非推奨警告の仕組みを知らない。私は、非推奨を扱う素晴らしいマジックがあるかもしれないと想像しています。いくつかのインタプリタのコマンドラインオプションに応じてエラーとして処理するか、サイレンシングすることができます。
質問:古くなったクラスエイリアス(または廃止されたクラス)の使用についてユーザーに警告する方法。
EDIT:クラスはOldClsName
を関数として定義されたときに呼び出すことはできませんいくつかのクラスメソッド(ファクトリメソッド)を持っているので、関数アプローチは(私はすでにそれを試して与えた)私のために動作しません。 。次のコードは動作しません。
class NewClsName(object):
@classmethod
def CreateVariant1(cls, ...):
pass
@classmethod
def CreateVariant2(cls, ...):
pass
def OldClsName(*args, **kwargs):
warnings.warn("The 'OldClsName' class was renamed [...]",
DeprecationWarning)
return NewClsName(*args, **kwargs)
OldClsName.CreateVariant1(...)
ための:
AttributeError: 'function' object has no attribute 'CreateVariant1'
が私の唯一のオプションを継承ますか?正直言って、それは私にはきれいに見えません。それは、不要な派生を導入することによってクラス階層に影響します。さらに、OldClsName is not NewClsName
はほとんどの場合問題ではありませんが、ライブラリを使用するコードが不適切な場合には問題が発生する可能性があります。
ダミーの無関係なOldClsName
クラスを作成して、コンストラクタとその中のすべてのクラスメソッドのラッパーを実装することもできますが、私の意見ではさらに悪い解決策です。
簡単同様である必要があり、継承をサポート - ちょうど 'クラスOldClsName(NewClsName書きます):#and overload __new__'。 – delnan
+1この解決策が使用されていることを確認し、 'warnings'モジュールに言及してください。残念ながら、関数の解決策は私のためには機能しません(編集された質問を参照)。多分あなたは他の清潔な解決策を持っていますか? :D –
新しいクラスへの呼び出しと属性の両方のアクセスをプロキシできるラッパーオブジェクトを使用する例で更新されました。 – AdamKG