2
3

More than 3 years have passed since last update.

デコレーター2

Posted at
2つのデコレーター1
def print_more(func):
    def wrapper(*args, **kwargs):
        print('func:', func.__name__)
        print('args:', args)
        print('kwargs:', kwargs)
        result = func(*args, **kwargs)
        print('result:', result)
        return result
    return wrapper

def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

@print_info
@print_more
def add_num(a, b):
    return a + b

r = add_num(10, 40)
print(r)
2つのデコレーター1の実行結果
start
func: add_num
args: (10, 20)
kwargs: {}
result: 30
end
30

@print_info@print_more の順番を入れ替えると
実行結果は

入れ替えた場合の実行結果
func: wrapper
args: (10, 40)
kwargs: {}
start
end
result: 50
50

となる

これは、
下記の様に
@を使わない書き方でかくと少しは分かりやすいかも。。。

2つのデコレーター2
def print_more(func):
    def wrapper(*args, **kwargs):
        print('func:', func.__name__)
        print('args:', args)
        print('kwargs:', kwargs)
        result = func(*args, **kwargs)
        print('result:', result)
        return result
    return wrapper

def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

def add_num(a, b):
    return a + b

f = print_info(print_more(add_num))
r = f(10, 40)
print(r)
2つのデコレーター2の実行結果
start
func: add_num
args: (10, 20)
kwargs: {}
result: 30
end
30

print_info で print_more を包み込むイメージ。。。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3