在分析funA()
函数装饰器和 funB()
函数的关系时,细心的读者可能会发现一个问题,即当 funB() 函数无参数时,可以直接将 funB ()
作为 funA()
的参数传入。但是,如果被修饰的函数本身带有参数,那应该如何传值呢?
比较简单的解决方法就是在函数装饰器中嵌套一个函数,该函数带有的参数个数和被装饰器修饰的函数相同。
例如:
def funA(fn):
# 定义一个嵌套函数
def say(arc):
print("Python 学习:", arc)
funB(arc)
return say
@funA
def funB(arc):
print("funB():", arc)
if __name__ == "__main__":
funB("http://python.study.net")
输出结果:
Python 学习: http://python.study.net
其实,它和如下程序是等价的:
def funA(fn):
# 定义一个嵌套函数
def say(arc):
print("Python 学习:",arc)
return say
def funB(arc):
print("funB():", arc)
if __name__ == "__main__":
funB = funA(funB)
funB("http://python.study.net")