【问题标题】:How to get arguments to a decorator?如何获得装饰器的参数?
【发布时间】:2014-05-21 15:15:36
【问题描述】:

在给定被包装的函数的情况下,有没有办法将参数传递给装饰器?例如,

@job('default')
def update_index():
    call_command("update_index", remove=True) 


func = update_index
args = ?? # How to use 'func' to get the string 'default' here?

【问题讨论】:

  • 这似乎不适用于这里。他正在寻找包装函数的参数,而不是装饰器的参数。

标签: python decorator python-decorators


【解决方案1】:

一般来说,你不能。

job('default') 被执行首先;返回的内容用作装饰器;本质上,python 确实:

def update_index():
    call_command("update_index", remove=True) 
update_index = job('default')(update_index)

因此,job('default') 可以返回任何东西。它可以返回一个除了返回参数之外什么都不做的函数:

def job(value):
    return lambda f: f

这对value 没有任何作用,并且返回的“装饰器”是空操作,它返回原始函数未更改

对于特定的装饰器,很可能它们留下了一个闭包或我们可以自省的额外属性。但这真的取决于 特定的 装饰器。

【讨论】:

  • 我不知道job('default')的返回值是如何在这里发挥作用的...我不想执行装饰器或update_index()
  • @jess:这就是装饰器语法的工作原理@ 之后的位是一个表达式。它被评估。结果是可调用的装饰器,然后通过传入的装饰函数调用它,返回值用于命名函数。
  • @jess: update_index() 没有在这里执行。但是装饰器,这就是应用装饰器的意思。
  • 啊是的,这是有道理的。谢谢!
猜你喜欢
  • 2017-07-19
  • 2017-11-19
  • 2022-08-15
  • 2018-03-02
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2012-12-05
  • 2018-05-30
相关资源
最近更新 更多