借用知乎的例子,由于匿名,不清楚具体用户,如有冒犯请联系我。
地址: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的方式)。