@
符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。
def f1(arg):
print("function f1")
rl = arg()
print(rl)
return rl + " f1 return"
# 这里 @ 符作符相当于 f1(f2())
@f1
def f2(arg=""):
print("function f2")
return arg + "f2 return"
print("------")
print(f2)
# Traceback --- TypeError: 'str' object is not callable
# 因为f1()中的rl = arg()没有参数
# print(f2("1"))
# output:
# function f1
# function f2
# f2 return
# ------
# f2 return f1 return
这种方式可以传递参数:
import sys
debug_log = sys.stderr
def f1(arg):
print("function f1")
def callf(*args, **kwargs):
debug_log.write('first argument: {}\n'.format(args[0]))
rl = arg(*args, **kwargs)
print(rl)
return rl + " f1 return"
return callf
@f1
def f2(arg=""):
print("function f2")
return arg + "f2 return"
print("------")
print(f2('sss'))
# output:
# first argument: sss
# function f1
# ------
# function f2
# sssf2 return
# sssf2 return f1 return