入戏三分丶 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 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug