*args
と**kwargs
を入力として受け取り、いくつかの変更を加えて元の関数を位置指定して呼び出すデコレータが必要です。修飾された関数からの名前付き引数は変更されません。デコレータの* argsと** kwargsだけを処理し、他の引数をそのまま残す方法
引数の変更は、args
とdict
のkwargs
のキーの前に付加するだけです。
など。私はこのように、このデコレータを使用する:ここでpos1
、pos2
とnamed1
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
と{'--named1': 'foobar', '--foo': 'bar'}
に('--foo', '--bar', '--foo', '--bar')
を通過すると、
func1('foo', 'bar', named1='foobar', ('--foo', '--bar'), {'--foo': 'bar'})
しかし、これは明らかに動作しないことができます。
だから、このようなfunc1
への呼び出しは:
func1('foo', 'bar', 'foo', 'bar', 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
。私の質問の
概要:は、装飾された機能の位置と名前付き引数のいずれかに触れることなく、私のDecoratorfunctionの*args
/**kwargs
-Argumentsのものを消費することなくデコレータで*args
と**kwargs
を解析する方法はありますか?
私は本当にこれらの([1](https://stackoverflow.com/questions/147816/preserving-signatures-of-decorated-functions)、[2](https:// stackoverflow。 com/questions/18906760/parsing-args-and-kwargs-in-decorators))はあなたの問題に対する正確な解決策を含んでいますが、少なくとも関連しており、貴重な洞察を提供することができます。特に、少なくとも[decorator'](https://pypi.python.org/pypi/decorator)モジュールをチェックする価値があります。 –