関数の引数をオーバーライドするPythonデコレータを作成しようとしていますが、inner()関数内に何を配置するかが本当にわかりません。ここで引数を変更する適切な方法は何ですか?
def override(*override_args, **override_kwargs):
def outer(f):
def inner(*args, **kwargs):
...
...
return inner
return outer
@override('Cat')
def my_function(animal, **kwargs):
print animal
print kwargs
my_function('Mouse', k1='1', k2='10')
def override(*override_args, **override_kwargs):
def outer(f):
def inner(*args, **kwargs):
min_args_length = min(len(args), len(override_args))
args = list(args)
for i in xrange(min_args_length):
args[i] = override_args[i]
kwargs.update(override_kwargs)
return f(*args, **kwargs)
return inner
return outer
@override('Cat', 'male', k1='0')
def my_function(animal, **kwargs):
print animal
print kwargs
my_function('Mouse', k1='1', k2='10')
出力:
Cat
{'k2': '10', 'k1': '0'}
説明:
argsは、名前のないargsを含むタプルであり、最大でmin(len(args)、len(override_args))をオーバーライドできます。
kwargsは、キーと値のペアとして名前付き引数を含むdictです。override_kwargsをkwargsに更新するだけです
また、引数の順序の不一致を防ぐために、名前付き引数「kwargs」のみをオーバーライドすることを強くお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加