0

次のコードがあるとします。

def addTags(functionHere):
    def wrapper():
        return "NumberTag" + functionHere() + "NumberTagOver"
    return wrapper

@addTags
def numbers(firstValue, secondValue):
    return firstValue + secondValue

次に、numbers(4, 5) をインタープリターに入れると、ラッパーが引数を取らないというトレースが返されます。では、numbers() をインタプリタに入れると、numbers には 2 つの引数が必要であることが返されます。混乱している。

4

1 に答える 1

6

ラッパー関数は、ラップされた関数を置き換え、受け取る引数の数と一致する必要があります。ラップされた関数は 2 つの引数(firstValue, secondValue)を受け取りますが、ラッパーはまったく受け取りません。

これら 2 つをデコレータ ラッパーに追加することもできます。

def addTags(functionHere):
    def wrapper(firstValue, secondValue):
        return "NumberTag" + functionHere(firstValue, secondValue) + "NumberTagOver"
    return wrapper

しかし、それはデコレータをその特定の機能に結び付けます。

ただし、使用できるトリックがあります。

def addTags(functionHere):
    def wrapper(*args):
        return "NumberTag" + functionHere(*args) + "NumberTagOver"
    return wrapper

位置引数はキャッチオールとして機能し、関数へのすべての*args位置引数はラップされた関数に渡されます。

キーワード引数にも同等のものがあります:

def addTags(functionHere):
    def wrapper(*args, **kw):
        return "NumberTag" + functionHere(*args, **kw) + "NumberTagOver"
    return wrapper
于 2013-03-15T17:54:57.827 に答える