私が装飾する関数の引数を保持するデコレータを作成しようとしています。これを行う動機はpytest.fixtures
とうまくやりとりするデコレータを書くことです。Pythonは関数の引数を保持するデコレータを作成します。
foo
があるとします。単一の引数a
が必要です。
def foo(a):
pass
我々がfoo
>>> inspect.getargspec(foo)
ArgSpec(args=['a'], varargs=None, keywords=None, defaults=None)
の引数の仕様を取得した場合私たちは頻繁にwrapper
機能がwrapped
関数にそのままそのすべての引数を渡すデコレータを作成したいです。これを行う最も明白な方法は*args
と**kwargs
です。
def identity_decorator(wrapped):
def wrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
return wrapper
def identity_decorator(wrapped):
def wrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
return wrapper
@identity_decorator
def foo(a):
pass
これは、当然のことながら、*args
と**kwargs
反射引数仕様と機能を生成します。
>>> inspect.getargspec(foo)
ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)
包まれた機能と一致するか、最初に右引数の仕様と機能を作成するには、引数の仕様を変更するためのいずれかの方法がありますか?
を私は、最近のPythonのバージョンでは、 'functools.wraps'は' inspect.getargspec'と '検査を行うために何かを考えます.signature'はラップされた関数のシグネチャを報告しますが、ラッパーの実際のシグネチャは変更しません。 ['decorator'](https://pypi.python.org/pypi/decorator)サードパーティのライブラリは、私が深く掘り下げたことのない手段で、実際に署名を保存するデコレータ機能を提供します。おそらく、バイトコードの書き換えのようなものを含んでいます。私はそれを使用したことはありません。 – user2357112
多分、http://stackoverflow.com/questions/3729378/how-can-i-programmatically-change-the-argspec-of-a-function-in-a-python-decoratoのようなものをチェックしてください。 – Nf4r