8

重複の可能性:
Pythonデコレータの関数のargspecをプログラムで変更するにはどうすればよいですか?

argspecは関数の引数を取得するための優れた方法ですが、関数が装飾されている場合は機能しません。

def dec(func):
    @wraps(func)
    def wrapper(*a, **k)
        return func()
    return wrapper


@dec
def f(arg1, arg2, arg3=SOME_VALUE):
    return

import inspect
print inspect.argspec(f)

-----------

ArgSpec(args=[], varargs='a', keywords='k', defaults=None)

Argspecは、、を返す必要がarg1ありarg2ますarg3。とをwrapper使わないように別の定義をする必要があると思いますが、その方法がわかりません。*a**k

4

1 に答える 1

9

モジュールはdecoratorそれらを正常に保存します。

from decorator import decorator
@decorator
def dec(func, *a, **k):
    return func()

@dec
def f(arg1, arg2, arg3=1):
    return

import inspect
print inspect.getargspec(f)
ArgSpec(args=['arg1', 'arg2', 'arg3'], varargs=None, keywords=None, defaults=(1,))

__foo__おそらく、関数からラッパー関数にいくつかの属性を手動でコピーすることで同じ効果を得ることができますが、とにかくデコレータモジュールはそれが可能であることを示し、おそらく出発点を提供します。

于 2012-09-24T03:42:53.397 に答える