weixin_44175133
入戏三分丶
2019-04-03 15:14
采纳率: 100%
浏览 365

关于Python中@的用法需要大神来解释下

函数1
def Typed(**kwargs):
def wrappers(obj):
print("=======>")
for key,val in kwargs.items():
setattr(obj,key,val)
return obj
print("---->")
return wrappers
@Typed(x=2)
def Text():
pass

函数2
def Typed2(func):
def wrappers():
print("=======>")
func()
# return res
print("---->")
return wrappers
@Typed2
def Text2():
pass

函数3
def foo(**kwargs):
pass
1、同时运行两个函数,为什么第一个函数里面的wrappers函数会执行,第二个里面的函数不会执行。
2、为什么第一个函数**kwargs是必须值,第三个函数的**kwargs不是必须的。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • zhengyajun_email
    Yajun-Z 2019-04-03 17:12
    已采纳

    第一个问题:问题的本质是没搞懂装饰器@的定义,函数1@被你传参为一个实例,不是函数,返回的是也一个实例对象,不是一个函数定义,等于你在函数1前调用了另一个函数。仅执行一次,不能复用。恰恰第二个函数起到了装饰的作用,是一个不带参数的装饰器,所以它的效果是声明了一个定义,不是运行一个函数,是可以服用的,会在你每次调用函数2时触发,你可以自行测试。

    第二个问题:既然是装饰器,它是会自动把被装饰函数作为参数传入的,而且是用位置参数传递的,你修改为关键字参数,又没传参,所以会报错,解决方法可以在位置参数前加上*args;而函数三没用装饰器,它就是一个可变的关键字参数,自然可以没有

    点赞 评论

相关推荐