【问题标题】:does modified function in python decorator has to return a valuepython装饰器中的修改函数是否必须返回一个值
【发布时间】:2017-09-28 06:51:05
【问题描述】:

我正在尝试了解装饰器的行为。 我知道装饰器必须返回一个对象,所以我可以理解下面的语法:

def my_deco(fonction):
    print("Deco is called with parameter the function {0}".format(fonction))
    return fonction

@my_deco
def hello():
    print("hello !")
Deco is called with parameter the function <function salut at 0x00BA5198>

这里装饰器做的不多,但是如果我需要修改功能,我会定义一个这样的装饰器

def my_deco(fonction):
    def modified_func():
        print("Warning ! calling {0}".format(fonction))
        return fonction()
    return modified_func
@my_deco
def hello():
    print("Salut !")

通过modified_func修改初始函数行为。这样就可以了

它包括对初始函数的调用。这很好

现在我不明白的是:为什么我们要返回函数的结果?在我的情况下,该函数是一个简单的“打印”,所以我不明白为什么我应该返回一些东西

感谢您的解释

【问题讨论】:

  • 因为您可以将装饰器应用于 any 函数,而那些其他函数很可能有返回值。另请参阅:支持任意参数。
  • 严格来说你不必return fonction()。您可以改为调用它,例如fonction() 并丢弃结果,或者在适当的情况下根本不调用 fonction。它是你的装饰器,所以你可以决定什么是有意义的。问问自己这个问题:fonction 的调用者是否应该期待一个明显不同的结果,如果它被装饰了?如果答案是“否”(通常是这样),那么装饰器返回的函数可能应该返回 fonction 的结果。
  • 感谢 jq170727 的解释

标签: python decorator


【解决方案1】:

就像在 cmets 中一样:通常当你编写一个装饰器时,你会制作它以便它可以与任何可能的功能一起使用。这样做的方法是返回原始函数返回的任何内容,或者转换该返回值(这也可以在包装函数中完成)。

在 Python 中,所有函数实际上 do 都会返回一些东西。没有显式返回语句的函数返回值None。所以,如果你的 wrpper 函数,在装饰器中,总是返回任何被装饰的函数返回,它会是安全的:即使被装饰的函数没有显式返回,它也会返回一个 None ,它只是由你的包装。

现在,这不是“强制性的”。如果您事先知道您的装饰器只会应用于没有返回值的函数,那么您也可以不将 return 语句放在包装函数中 - 这不是错误的语法(但它可能是您未来的陷阱自我)。

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 2018-03-10
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2014-09-10
    • 2021-01-17
    • 2022-01-20
    • 2021-07-19
    相关资源
    最近更新 更多