【问题标题】:Returning wrapper in decorator functions在装饰器函数中返回包装器
【发布时间】:2020-12-30 14:17:04
【问题描述】:

我有一个关于退回包装器的问题,为什么我必须退回它,我在哪里退回这个? 我知道当我返回包装器时,它会返回一个指针,但是在哪里以及原因是什么。我不应该在 deco 函数中调用它,比如 def deco(fun): ......... wrapper()。

import  time

def deco(fun) :
    def wrapper(*args) :
        ba = time.time()

        giden = fun(*args)

        so = time.time()

        print(f"{so-ba} saniye geçti")

        return giden
    return wrapper


@deco
def ortalama (liste):
    t = 0
    for i in liste:
        t += i
    return t

liste = list(range(0,10))
a = ortalama(liste)
print(a)

【问题讨论】:

  • def somefunc() 之前添加@deco 行“仅仅是语法糖”,相当于在遵循函数定义之后添加somefunc = deco(somefunc)——这就是原因。在线文档的glossary 中对其进行了简要描述。

标签: python


【解决方案1】:

deco 接受一个函数作为参数并返回一个函数。

当您应用它时,ortalama 函数将替换为 deco(ortalama)

【讨论】:

    【解决方案2】:

    装饰器函数封装了目标函数并且可以操作它们的输入和输出值。返回内部包装函数替换目标函数。

    使用装饰器注解,使用包装函数更改函数。

    > print(ortalama)
    
    <function deco.<locals>.wrapper at 0x7f7d6beea048>
    

    没有装饰器,函数仍然是定义的

    > print(ortalama)
    
    <function ortalama at 0x7f7d6beea158>
    

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2021-06-24
      • 2018-11-20
      • 2011-06-25
      • 2021-07-25
      • 2014-05-19
      • 2017-11-05
      • 2019-11-05
      • 2020-12-04
      相关资源
      最近更新 更多