6

私が書いているデコレーターの場合、関数の特定の名前付きパラメーターを操作したいと思います。次のデコレータを検討してください。

def square_param(param):
    def func_decorator(func):
        def func_caller(*args,**kwargs):
            kwargs[param] = kwargs[param] * kwargs[param]
            return func(*args,**kwargs)
    return func_caller
return func_decorator

次の関数に適用:

@square_param('dividend')
def quotient(divisor=1,dividend=0):
    return dividend/divisor

これは、被除数がキーワード引数として呼び出された場合に機能します。例:

>>> quotient(dividend=2)
4

ただし、位置引数として指定すると、これは失敗します。

>>> quotient(3,4)
TypeError: quotient() got multiple values for keyword argument 'dividend'

Python 3 では、パラメータを常にキーワードとして指定することでこれを解決できました。

@square_param('dividend')
def quotient(divisor=1,*,dividend=0):
    return dividend/divisor

しかし、私は Python 2 をサポートしたいと思います。また、機能に少し制限を加えたいと思っています。

デコレータでこの動作を修正する方法はありますか?

4

3 に答える 3

2

Inspect を使用しなくても、関数のパラメーターを取得できます

>>> func = lambda x, y, args: (x, y, {})
>>> func.func_code.co_argcount
3
>>> func.func_code.co_varnames
('x', 'y', 'args')
于 2011-07-05T08:16:52.610 に答える