Python 3.x 为什么我需要在高阶函数中再次返回
一直在研究python3中的一些Python 3.x 为什么我需要在高阶函数中再次返回,python-3.x,python-decorators,Python 3.x,Python Decorators,一直在研究python3中的一些装饰程序。下面是一段代码片段。在包装器函数中调用函数(fn)时,为什么需要返回该函数 from functools import wraps def log_function_data(fn): @wraps(fn) def wrapper(*args, **kwargs): print(fn.__name__) print(fn.__doc__) return fn(*args, **kwargs
装饰程序。下面是一段代码片段。在包装器
函数中调用函数(fn
)时,为什么需要返回该函数
from functools import wraps
def log_function_data(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
print(fn.__name__)
print(fn.__doc__)
return fn(*args, **kwargs) #why am i returning this?
return wrapper
@log_function_data
def add(x,y):
'''Adds 2 numbers and returns'''
return x + y
add
函数已返回操作结果。因此,我在不使用装饰器的情况下调用add函数,返回结果如下:
def add(x,y):
'''Adds 2 numbers and returns'''
return x + y
result = add(2,3) ##have the result = 5
请咨询服务中心。
Python在不同的时间解释代码:
一次,每次(当我们为函数生成字节码时)
在运行时(调用函数时)重复执行
您可以选择不返回fn
,但这将导致对生成的字节码进行重要更改,从而生成一个修饰函数,返回默认值None
。由于生成的字节码甚至不需要调用add()
,因此很难将最终结果调用为“修饰”函数,它更像是一个完全不同的函数,忽略了传递给它的fn
为了更好地理解装饰,你可能会发现和它一起玩很有教育意义。我建议您对源代码进行一行更改,并注意不同字节码之间的差异。假设您认识一位数学非常好的人。想象一下,这个女孩,爱丽丝,非常好,她是世界上唯一能解决问题的人
这里有一个陷阱,Alice只会说法语,但是问题X是用任意挑选的语言解释的,而且预计也会用同样的语言回答。可悲的是,她无法用法语以外的语言来解释问题X
假设你对解决问题X感兴趣。你想了2分钟,得出了一个解决方案:
我认识爱丽丝,她有数学部分,我认识伯纳德,他会
从任何一种语言翻译成法语,再回到完美状态。让我们做个决定
他们一起解决问题X
他们将使用的算法如下:
伯纳德阅读问题X并将其翻译成法语
Alice解决了X的法语版本
伯纳德把爱丽丝的答案翻译成原文
返回解决方案
在python中,如下所示:
def main():
疯狂的译者=伯纳德()
def附加_转换器(法语_解算器):
def翻译_装饰器(X):
法语X=疯狂的翻译(X,input\u lang=X.lang,output=“fr”)
法语解算器=法语解算器(法语X)
解决方案=疯狂的翻译(法语解决方案,input_lang=“fr”,output=X.lang)
返回溶液
返回翻译修饰符
x=x()
solve=attach\u translator(Alice.solve)
解=解(x)
打印(解决方案)
班级名称:
@静力学方法
def solve(法语):
#用法语做一些不可思议的事情,爱丽丝是个天才。
返回法语_X+“42”
伯纳德班:
def翻译(自我、文本、输入=无、输出=无):
#把任何输入语言翻译成任何输出语言,伯纳德都疯了!
返回f“从:\n\t{text}的{input\u lang}到{output}”
X类:
定义初始化(自):
self.lang=“外星人”
定义(自我):
返回“\t问题定义”
main()
伯纳德被用作翻译来“装饰”爱丽丝的工作能力。如果你不打电话给fn
,那就意味着你没有让Alice工作,因此你只是来回翻译,没有任何好处。decorator的目标是在调用修饰函数之前和之后添加一些处理,重点是以不同于最初设计的方式调用函数。记下一个问题,没有任何注释是一种耻辱!
return fn(*args, **kwargs) # why am i returning this?