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

关于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条回答 默认 最新

  • Yajun-Z 2019-04-03 17:12
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料