【问题标题】:add lines before and after my function usind decorator使用装饰器在我的函数之前和之后添加行
【发布时间】:2020-07-01 23:05:47
【问题描述】:

你好,我有这个代码使用 python :

def test(a,b):
    print(a+b)

我想创建一个装饰器,允许这样做:

def test1(a,b):
    print(a*b) # add this first line
    print(a+b)
    print(a-b) # add this last line

其实我也想做这样的事情:

@my_decorator
def test(a,b):
    print(a+b)

这将与函数 test1 相同。有可能吗?

非常感谢!

【问题讨论】:

  • 有点。如果test 将任何内容分配给ab,您的装饰器将无法获取print(a-b) 的新值。

标签: python python-3.x decorator


【解决方案1】:

你想要这个:

def dec(f):
    def wrap(a, b):
        print(a * b)
        f(a, b)
        print(a - b)
    return wrap

@dec
def test(a, b):
    print(a + b)

请记住,通过将test 装饰为dec,您将test 替换为wrap

>>> test(4, 5)
20
9
-1

【讨论】:

  • 这并不等同于在包装函数的定义中插入那些额外的prints,特别是如果包装函数分配给ab
  • @user2357112supportsMonica 什么?如果它不等价那是什么?如果您的包装函数更改了您提供的输入值,我认为您遇到的问题不仅仅是与装饰器作斗争。函数接受参数并返回值。
  • 大量函数分配给它们的参数只是为了跳过额外的代码来创建另一个要使用的变量。意图不是让赋值影响调用者的变量。
  • 例如,您可能有一个函数def find(bst, element),它在二叉搜索树中搜索一个值并将子树分配给bst,因为它遍历树而不是使用单独的变量来保存当前节点。
  • @user2357112supportsMonica 如果你有 add 功能,它可以转动风扇,吹火,推动一根杆子,轻轻地将水壶推入火中,并触摸一个小型振动计时器,当计时器结束时,它会摇动,轻轻地移动鼓风机,停止吹火,然后火就熄灭了。此时水壶里的水已经沸腾了。我需要一个装饰器,它可以在计时器振动 x 秒后向我发送一条短信。
猜你喜欢
  • 2010-09-25
  • 2013-04-07
  • 2011-12-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多