このようなサンプルコードをよく見かけますが、出力が同じでargsとkwargsのある意味がわかりません。
なんとなく、雰囲気でみなさん書いているのか、もしくは僕の理解が間違っているのか気になるのでご確認させてください。
個人的には、argsとkwargsはなくていいと思っています。さらに、コード内で入れ子にして def wrapper(): を記載する必要があるのかも疑問です、意図が理解できる方はおしえていただけませんか?何の確認のために記載するかわかりませんが、仮になにか確認のためにdef wrapper(): を書いているとしたら、どんな時にこういうコードを実際の開発でかきますか?
argsとkwargsの理解は以下です。
*args: 複数の引数をタプルとして受け取る
example
1def my_sum2(*args): 2 print('args: ', args) 3 print('type: ', type(args)) 4 print('sum : ', sum(args)) 5 6my_sum2(1, 2, 3, 4) 7# args: (1, 2, 3, 4) 8# type: <class 'tuple'> 9# sum : 10
**kwargs: 複数のキーワード引数を辞書として受け取る
**をつけた引数を定義すると、任意の数のキーワード引数を指定することができる。関数の中では引数名がキーkey、値がvalueとなる辞書として受け取られる。
example
1def func_kwargs(**kwargs): 2 print('kwargs: ', kwargs) 3 print('type: ', type(kwargs)) 4 5func_kwargs(key1=1, key2=2, key3=3) 6# kwargs: {'key1': 1, 'key2': 2, 'key3': 3} 7# type: <class 'dict'>
decoratorのサンプルコードでのargsとkwargs
argsとkwargs記載有りのコード
python
1def deco(func): 2 def wrapper(*args, **kwargs): 3 print('--start--') 4 func(*args, **kwargs) 5 print('--end--') 6 return wrapper 7 8@deco 9def test(): 10 print('Hello Decorator') 11 12test() 13 14## -- End pasted text -- 15--start-- 16Hello Decorator 17--end--
argsとkwargs記載なしのコード
python
1def deco(func): 2 def wrapper(): 3 print('--start--') 4 func() 5 print('--end--') 6 return wrapper 7 8@deco 9def test(): 10 print('Hello Decorator') 11 12test() 13 14## -- End pasted text -- 15--start-- 16Hello Decorator 17--end--
この def wrapper()をデコレーターにすると(@wraps(func))どういうメリットがあるのでしょうか?
@wraps(func)
発展型の理解
from functools import wraps def validation_objecs(func): @wraps(func) def wrapper(request): .... .... .... return func(request) return wrapper .... .... .... @validation_objecs def start_batch(request): .... .... ....
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/10 02:35
2018/08/10 02:40
2018/08/10 02:43
2018/08/10 04:20 編集
2018/08/10 04:50
2018/08/10 04:58