5

からの戻り値から実際に呼び出すために使用できるペアinspect.getcallargs(func)に戻す方法はありますか?*args, **kwfunc

ユースケース: デコレーターを書いていて、関数の特定の引数を名前で変更したいとします。これを行うためのコードの冒頭は次のとおりです。

@fix_x
def a(x):
    print x

@fix_x
def b(**q):
    print q['x']

def fix_x(func):
    def wrapper(*args, **kw):
        argspec = inspect.getargspec(func)
        callargs = inspect.getcallargs(func, *args, **kw)
        if 'x' in callargs:
            callargs['x'] += 5
        elif 'x' in callargs[argspec.keywords]:
            callargs[argspec.keywords]['x'] += 5
        # ...and now I'd like a simple way to call func with callargs...?

(私は実際には、それらを構築してからそれらを呼び出したいと思っている間に、callargs を使ってもっと手の込んだことをしていますが、これは私が探しているもののアイデアを与えるはずです。)

4

2 に答える 2

3

いいえ、現在これを行うための良い方法はありませんが、Python 3.3で作業中です!

この新機能がどのように機能するかについては、PEP362-関数署名オブジェクトを参照してください。

于 2012-06-07T22:49:55.257 に答える
0

私は(多かれ少なかれ)これを行うために独自のコードを書きました。https://github.com/codemage/wmpyArgSpec.make_call_argsあります

セマンティクスはわずかに異なります。つまり、 **kw パラメータにちなんで名付けられた別のエントリ dict を受け入れるのではなく、不明な引数を **kw にシャントするだけですが、必要に応じて変更するのは簡単です。

少しの労力で、これはおそらくPEP 362から Python 2.7 へのかなり完全な「バックポート」 (コードを共有しないため、引用符で囲まれています) に変わる可能性があります。キーワードのみのパラメーターは実行しませんが、それらはいずれにせよ 2.x には存在しないため、API の完全性には影響しません。また、inspect モジュールは他のすべての重要な機構を提供します。

于 2012-06-09T05:43:01.320 に答える