Python @语法糖与闭包的理解

借用知乎的例子,由于匿名,不清楚具体用户,如有冒犯请联系我。
地址:https://www.zhihu.com/question/25950466

这篇文章是将知乎的解释和自己的理解,将解释部分简化并且总结一下语法糖的书写规律,自己也做一些output供后来人能够更快的理解这部分知识,如有不正,希望积极指出,我会不定时回复和补充。

import logging
logging.basicConfig(level1 = logging.INFO)

def add(a,b):
	return(a+b)

def checkParams(fn):
	def wrapper(a,b):
		if type(a) is int and type(b) is int:
			return fn(a,b)
		
		logging.warrning('a & b can not be added')
		return
	return wrapper
if __name__ == "__main__":
	add = checkParams(add)
	add(3,'hello')

首先

add = checkParams(add)

这句话使得 add 与 checkParam(fn) 的返回值 wrapper 指向同一个对象,即 add 与 wrapper 是一个函数。
然后下一句

add(3,'hello')

这句话其实就等价于wrapper(3,‘hello’),继而就执行下面的语句

def wrapper(a,b):
		if type(a) is int and type(b) is int:

执行结束之后(这一步的目的就是再执行主函数之前进行某种准备,或者检查,即对于主功能的完善),就要执行主函数了,也就是返回fn(a,b),这里需要用到fn,因此从内而外找,再checkParams函数体中找到这个fn,此时fn指向的是add。
然后进一步完成相加的工作,并返回相加的结果。这样就完成了整个语法糖的执行过程。

需要注意的是,修饰函数checkParams的写法如下,
两层函数外层为Out,内层为In

内层返回外层,即Out(arg),这一步目的是引用被修饰函数从而实现被修饰函数的函数主要功能。
外层返回内层,即In,这里要注意返回的是In不是In(),返回In就是返回函数体。这一步的目的是将被修饰函数与内层函数In联系起来。

简单说语法糖的写法就是将函数体与内层函数In联系起来,进而先执行In函数中定义的某些检验语句,然后再执行被修饰函数主函数的内容(通过return的方式)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值