デコレーターの例。このデコレーターはある関数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
'''