【问题标题】:Why do we return None in this decorator?为什么我们在这个装饰器中返回 None ?
【发布时间】:2019-02-24 09:00:18
【问题描述】:

我正在用 Python 阅读这段代码 sn-p:

def decorator_function(original_function):
    def wrapper_function(*arg,**kwargs):
        print("This line is executed before the original function")
        result = original_function(*arg, **kwargs)
        print("This line is executed after the original function")
        print (result)
        return result #Why do we need to return result from this decorator?
    return wrapper_function

@decorator_function
def display_info(name, age):
    print(name, age)

display_info("You", 1)
display_info("Me", 99)

修饰函数返回一个 None,上面的代码 sn-p 将产生相同的结果,无论我们是否有这行 return result

我想知道是否有任何理由(Pythonic?未来的代码维护?)返回这个 None。

代码 sn-p 是 YouTube 上关于装饰器的 Python 教程的一部分。

谢谢

【问题讨论】:

  • 你原来的函数display_info返回None,因为它没有return语句。这与装饰器无关。修饰后的版本返回result,这是原始函数的返回值,即None。如果使用相同的装饰器来装饰一个不同的函数(一个返回值的函数),它就会有不同的返回值。
  • @khelwood,谢谢我在原来的帖子中犯了一个错误。我想问的是:为什么我们有返回结果,而不是打印(结果)。
  • 你应该使用 # 在 python 中启动内联 cmets 而不是 //
  • @Mohit,谢谢。已更正

标签: python return return-value python-decorators


【解决方案1】:

装饰函数将返回None,因为函数display_info 没有return 语句,因此它返回void。 decorator_function 内部的闭包返回并打印与调用原始函数 display_info(装饰器的操作未触及)返回的值相同的值,很明显它将返回一个 None 值。

编辑

为什么我们需要那个 return 语句?

在这种情况下这是完全可选的,你确定这个装饰器只能被添加到一个返回 void 或绝对没有的函数中,但如果不是这种情况,你需要添加一个 return 语句,因为如果你不这样做' t 添加一个 return 语句,你的原始函数有机会返回一些东西将返回 void。

【讨论】:

  • 谢谢我在原来的帖子中犯了一个错误。我想问的是:为什么我们有返回结果,而不是打印(结果)
  • @YuZhang 编辑了我的帖子,看看有没有帮助
  • 是的,当然。我在想一张有限的照片。由于装饰器函数不确定装饰函数将返回什么,它可以是 None 或其他东西;作为一种好的做法,我们需要将其退回。
【解决方案2】:

它正在返回 None,因为您的 display_info() 没有返回任何内容。

result = original_function(*arg, **kwargs)

这里的结果,将得到None。因此,当您尝试 print(result) 时,您会得到 None。

我相信您在 result 中期待元组 ("You", 1)

【讨论】:

  • 谢谢我在原来的帖子中犯了一个错误。我想问的是:为什么我们有返回结果,而不是打印(结果)
  • @YuZhang 因为要退货而不是打印?你懂the difference between return and print吗?
  • @Aran-Fey,emmmmm,看来我的问题还不清楚。我的意思是问为什么我会返回一个 None ,这对这个程序的结果没有影响;从 Mohit 的回答中,我想他/她回答了:decorator 函数可以用来装饰很多函数,其中一些返回 None,一些不返回 None。作为预防措施/良好做法,我们返回装饰函数的结果。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 2013-02-17
  • 2021-05-10
  • 2019-12-11
  • 1970-01-01
  • 2018-04-17
  • 2010-09-21
  • 2019-01-18
相关资源
最近更新 更多