【问题标题】:Decorator for function with optional arguments带有可选参数的函数的装饰器
【发布时间】:2014-09-17 12:10:56
【问题描述】:

我有一个带有许多参数的函数 my_f(其中一些可以是可选的),例如,

def my_f(a, b, opt_arg = 3):
    #do some stuff

现在我想为这个函数写一些装饰器,它会根据可选参数 opt_arg 做一些简单的事情。我不知道 my_f 的参数数量,但我知道可选参数的名称。我怎么能做到这一点?是否有可能使my_f(1,2, opt_arg=3)my_f(opt_arg =3, 1,2,3,4) 两种变体都能正常工作?

【问题讨论】:

  • 我相信my_f(opt_arg =3, 1,2,3,4) 是一个 SyntaxError 无论你如何尝试装饰它。
  • 可以看到元组my_f.func_defaults中的默认值。
  • @jonrsharpe:OP 并没有在这里要求自省..

标签: python python-2.7 decorator python-decorators


【解决方案1】:

在装饰器包装器中使用 **kw 变量关键字参数并查看其中是否存在 opt_arg

from functools import wraps

def yourdecorator(f):
    @wraps(f)
    def wrapper(*args, **kw):
        opt_arg = kw.get('opt_arg')
        if opt_arg is not None:
            print "opt_arg was given and set to {!r}".format(opt_arg)
        return f(*args, **kw)
    return wrapper

演示:

>>> from functools import wraps
>>> def yourdecorator(f):
...     @wraps(f)
...     def wrapper(*args, **kw):
...         opt_arg = kw.get('opt_arg')
...         if opt_arg is not None:
...             print "opt_arg was given and set to {!r}".format(opt_arg)
...         return f(*args, **kw)
...     return wrapper
... 
>>> @yourdecorator
... def my_f(a, b, opt_arg=3):
...     pass
... 
>>> my_f(42, 81)
>>> my_f(42, 81, opt_arg=3.14)
opt_arg was given and set to 3.14

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 2014-07-21
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2012-03-14
    • 2021-12-17
    相关资源
    最近更新 更多