Python 3.x 为什么我需要在高阶函数中再次返回

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

一直在研究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)   #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?