【发布时间】:2018-04-05 11:09:12
【问题描述】:
我想要一个装饰器,它只接受 *args 和 **kwargs 作为输入,对它们进行一些更改,然后调用原始函数,并使用装饰函数中的位置和命名参数保持不变。
对参数的更改只是将-- 添加到args 以及kwargs 的dict 的键之前。
例如我想像这样使用这个装饰器:
from decorator import decorator
@decorator
def prepare_opts(decorated_func, *args, **kwargs):
prepared_args = prepare_single_opt_keys(args)
prepared_kwargs = prepare_named_opt_keys(kwargs)
return decorated_func(*prepared_args, **prepared_kwargs)
@my_decorator
def func1(pos1, pos2, *args, named1=None, **kwargs):
...do stuff
这里的pos1、pos2和named1应该被装饰器忽略。
所以像这样调用func1:
func1('foo', 'bar', 'foo', 'bar', named1='foobar', foo='bar')
应该像这样调用装饰函数:
func1('foo', 'bar', named1='foobar', ('--foo', '--bar'), {'--foo': 'bar'})
但这显然行不通,因为装饰器将('--foo', '--bar', '--foo', '--bar') 传递给pos1 和{'--named1': 'foobar', '--foo': 'bar'} 传递给pos2。
我知道如果我将装饰器更改为:
@decorator
def prepare_opts(decorated_func, pos1, pos2, *args, named1, **kwargs):
prepared_args = prepare_single_opt_keys(args)
prepared_kwargs = prepare_named_opt_keys(kwargs)
return decorated_func(pos1, pos2, *prepared_args, named1, **prepared_kwargs)
但这里的问题是,我希望装饰器能够处理许多不同的函数,它们都有不同数量的位置和命名参数以及额外的 *args 和 **kwargs。
我的问题总结:有没有办法在装饰器中解析*args 和**kwargs,而不触及装饰函数的任何位置和命名参数,并且不消耗*args/ 中的参数**kwargs-我的装饰函数的参数?
【问题讨论】:
标签: python-3.x decorator args keyword-argument