【问题标题】:A decorator that works on every function适用于所有功能的装饰器
【发布时间】:2018-06-02 11:07:04
【问题描述】:

我想在每个函数调用上打印 Hello World,我正在使用装饰器来实现这一点。

def hello_decorator(fn):
    def ret_fn(*args, **kwargs):
        print("Hello world")
        return fn(*args, **kwargs)
    return ret_fn

假设这导致函数出错,而该函数的未修饰版本工作正常,那么修饰器可能有什么问题?问题不在于打印,因为我可以删除它并且问题仍然存在。

有没有更好的方法来包装一个函数并完全按照没有原型的方式调用它?

【问题讨论】:

  • 这不是一个有效的装饰器。装饰器应该返回一个函数。
  • 看看wrapt
  • “没有原型调用”是什么意思。你能进一步解释一下吗?
  • @LaurentLAPORTE 在不知道原型的情况下按调用读取。我的意思是如何在不知道原型的情况下装饰任意函数?
  • @1419636215 就像你现在做的那样,直接传递*args**kwargs。此外,您可以使用functools.wraps 保留装饰函数的更多详细信息(例如名称、文档字符串等)

标签: python python-decorators


【解决方案1】:

装饰器必须返回一个函数。

def hello_decorator(fn):
    def ret_fn(*args, **kwargs):
        print("Hello world")
        return fn(*args, **kwargs)
    return ret_fn

【讨论】:

  • 很抱歉。我已经编辑了问题中的代码。
猜你喜欢
  • 2019-07-02
  • 2015-07-07
  • 2020-04-25
  • 2014-02-26
  • 2021-06-15
  • 1970-01-01
  • 2014-09-19
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多