0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

デコレーターのメモ

Posted at

デコレーターの例。このデコレーターはある関数A内で使われている関数Bについて、
その関数Bの引数を{'関数B':*args, **kwargs}で指定して、関数Aの引数とすることで、関数B内で引き継がれるというもの。

def search_args_kwargs(func):
    func_name=func.__name__
    def wrapper(parent_kwargs, *args1, **kwargs1):
        if func_name in parent_kwargs:
            *args2, kwargs2=parent_kwargs[func.__name__]
            return func(*args1, *args2, **kwargs1, **kwargs2)
        else:
            return func(*args1, **kwargs1)
    return wrapper

def detail1(*args, **kwargs):
    string='My age is {}.'.format(*args)
    print(string)
    string='I was born in {year}.'.format(**kwargs)
    print(string)

def detail2(*args, **kwargs):
    string='Talking about My {} years old {} dog.'.format(*args)
    print(string)
    string='He was born in {year}, who likes {likes}.'.format(**kwargs)
    print(string)
    
def greeting(*args, **kwargs):
    string='I am a {}. My pet is {}'.format(*args)
    print(string)
    kwargs.update({'type_pet':args[1]})
    string='I am {me}. My {type_pet} is {pet}'.format(**kwargs)
    print(string)
    search_args_kwargs(detail1)(kwargs, 28, year=1991)
    search_args_kwargs(detail2)(kwargs, 3, year=2016)

greeting('human','dog', me='Taro', pet='Kuro',
         detail2=('cute',{'likes':'milk'}))

'''
>>I am a human. My pet is dog
I am Taro. My dog is Kuro
My age is 28.
I was born in 1991.
Talking about My 3 years old cute dog.
He was born in 2016, who likes milk.
'''

こちらはデコレーターの簡単な例

def deco(func):
    def wrapper(*args, **kwargs):
        print('Decorated!')
        return func(*args, **kwargs)
    return wrapper

@deco
def f(i):
    return i+1

f(1)

'''
>>Decorated!
2
'''
0
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?