ソフトな忘却力(118) Pythonのデコレータで、非推奨の関数に自前警告

Joseph Halfmoon

「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。今回はPythonバージョンによってはLecturesで解説の方法は不要。しかし当方バージョンでは有効、な件であります。この関数は古いから非推奨ね、と警告するためのデコレータっす。

※「 ソフトな忘却力」投稿順 Index はこちら

※Sypder IDEはWindows版 6.0.8使用です。Python処理系はPython 3.11.13です。

Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でも老い先短い年寄には量が多過ぎて多分死ぬまでに終わりません。適当な練習でお茶を濁してます。今回は「7.2 Decorators」の「7.2.5 Deprecation of functions」です。

Python 3.13以降では、@warnings.deprecated デコレータが使用可能

3.13処理系以降では、warningsモジュール内に deprecatedという御名前のデコレータが定義されているみたいです。それを使えば Lectures の「7.2.5 Deprecation of functions」でお教えいただいている方法は不要じゃないか、と思います。知らんけど。

しかし、生憎、当方で使用しているのは 3.11処理系です。この処理系上では以下のようなエラーメッセージが出力されます。

ImportError: cannot import name ‘deprecated’ from ‘warnings’

Lectures の「7.2.5 Deprecation of functions」では、自前で上記の deprecatedデコレータに近いデコレータを定義する方法をお教え下すってます。これを使えば3.11でもOKね。

実験用のモジュール

わざわざ「非推奨だから他使え」などと警告を発するということであれば、ライブラリとして参照されるモジュール内に仕込み、それを別ファイルで呼び出したときに警告が発現するということでありましょう。

以下は、7.2.5 Deprecation of functionsで定義されているデコレータを丸ごとコピーさせていただいた上で、deprecatedなfunc1と、そうでない func2を含むモジュールの例であります。

class deprecated(object):
    """Print a deprecation warning once on first use of the function.

    f is deprecated
    """

    def __call__(self, func):
        self.func = func
        self.count = 0
        return self._wrapper

    def _wrapper(self, *args, **kwargs):
        self.count += 1
        if self.count == 1:
            print(self.func.__name__, 'is deprecated')
        return self.func(*args, **kwargs)

@deprecated()
def func1():
    print("func1")
    return -1

def func2():
    print("func2")
    return -2
上記モジュールを呼び出して使った結果

上記モジュール train_module0をimportして、func1、func2を呼び出した結果が以下に。deplicatedWarnings

func1を呼び出すと、deprecated警告が発出され、func2の場合は何もなしっと。

でもま、Pythonのバージョンを3.13に上げれば要らない話だよな。トホホ。

ソフトな忘却力(117) Pythonのデコレータで、キャッシュ? へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です