给定Python装饰器代码中,为何需要**kwargs?仅用*args也可运行
为什么装饰器里需要**kwargs?
你的测试里只用位置参数调用add(1, 2),这时候确实只靠*args就能传递参数,程序能正常跑,但**kwargs的存在是为了让装饰器适配更多传参场景,避免在某些情况下报错。
具体来说:
- 如果被装饰函数用关键字参数调用,比如
add(a=1, b=2),要是装饰器里没有**kwargs,这些关键字参数没法被传递给原函数add,会直接触发TypeError,因为add需要a和b两个参数,但装饰器没把关键字参数传过去。 - 举个反例,把代码里的
**kwargs去掉:
def greet(fx): def mfx(*args): print("Good Morning") fx(*args) print(args) print("Thanks for using this function") return mfx @greet def add(a, b): print(a+b) add(a=1, b=2) # 关键字传参
运行这段代码就会报错:TypeError: add() missing 2 required positional arguments: 'a' and 'b',因为*args只能捕获位置参数,拿不到关键字参数,自然没法传给add。
- 另外,如果被装饰函数有默认参数,比如
def add(a, b=0):,当你用add(b=2, a=1)或者add(1)这种方式调用时,**kwargs也能帮你正确传递那些关键字形式的参数,保证函数正常执行。
简单说,加上**kwargs是为了让装饰器更通用,不管被装饰函数是用位置参数、关键字参数,还是混合方式传参,都能正确把参数传递给原函数,不会因为传参方式不同就报错。
内容的提问来源于stack exchange,提问作者Shashank Gupta
相关产品推荐
相关产品推荐

