Help us understand the problem. What is going on with this article?

Python関数の引数と返り値の型をチェックするデコレータ

More than 1 year has passed since last update.

概要

Pythonで作った自作関数を使用する時に、意図しない利用や挙動を検出するために、引数と返り値の型をチェックするデコレータを作ってみた。
型アノテーションを利用するため、Python3が前提になります。
内容をログに出すことで、デバッグする際にも役立ちます。
※間違い等ありましたらご指摘お願いします。

方法

デコレータの定義

検証デコレータ
import inspect

def validate_func(func):
    def validate_func_wrapper(*args, **kwargs):
        sig = inspect.signature(func)
        args_value = sig.bind(*args, **kwargs)  # 引数名と値のdict

        # 引数の検証
        for args_name, args_value in args_value.items():
            args_type = sig.parameters[args_name].annotation
            # 型が指定されている(not empty)、かつ 型が一致していない場合エラー
            if args_type is not inspect._empty and type(args_value) != args_type:
                raise Exception('引数の型が異なります')

        results = func(*args, **kwargs)

        # 返り値の検証
        return_type = sig.return_annotation
        # 型が指定されている(not empty)、かつ型が一致していない場合エラー
        if return_type is not inspect._empty and type(results) != return_type:
            raise Exception('返り値の型が異なります')

        return results
    return validate_func_wrapper

使い方例

使い方例
@validate_func
def test(a:int, b:int = 2) -> int:
    return a + b

test(1)  # 正常終了
test(1.0)  # エラー

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした