当程序使用“@函数”(如@funA)装饰另一个函数(funB)时,实际过程中执行的操作可分为两步:
- 将被修饰的函数(funB)作为参数传给@符号引用的函数(funA)
- 将被修饰的函数(funB)转换为@符号引用的函数(funA)的返回值
如下代码示例:
def funA(fn):
print("this is funA")
fn() # 执行传入的fn参数
return ”funA return str“
@funA
def funB():
print("this is funB")
print(funB)
以上代码在jupyter-notebook 执行结果:
结果分析:
按照本文开头说的步骤:
首先应该执行第一步,将被修饰的函数(funB)作为参数传给@符号引用的函数(funA)。也就是说此时funB作为funA的参数fn ; 需要说明的是,代码中’@funA‘ 也是一条指令,这条指令执行的是将funB作为参数替换后的funA,但是此时不输出返回值。所以有两个输出:“this is funA”, “this is funB”
第二步,将被修饰的函数(funB)转换为@符号引用的函数(funA)的返回值。由于funA 返回值是一个字符串 ”funA return str“ ,所以此时经过@funA 修饰以后,funB变成了字符串 ”funA return str“ 。print(funB) 结果为 funA return str。 当然,若funA返回值是一个指令,如fn,则funB的值是一个函数,将会执行funB函数中的指令。