1

この例は、Beazley、Python Essential Reference 4e、pg:101から抜粋したものです。

彼はどうしていますか:

func(*args, **kwargs)

ここで、「func」は1つの引数を取る平方関数です。この章の前半で、彼は、呼び出し/定義で引数の位置と数がどのように一致する必要があるかについて説明します。一致しないと、TypeErrorが発生します。

また、

@trace
def square(x):
    ...
square = trace(square)

traceは'callf'を返すので、これは次のように書くのと同じです。square = callfこれは、squareがnew-function-objectを参照するため、。で呼び出すことができるため、問題ありません*args, **kwargs。しかし、その後、callf彼はしますfunc(*args...

'square'が他のオブジェクトを参照するようにしたとすると、元の正方形に内部でアクセスするにはどうすればよいですか?どのようなメカニズムが機能し始めていますか?

@trace
def square(x):
    return x*x

enable_tracing = True
if enable_tracing:
    debug_log = open("debug.log","w")

def trace(func):
    if enable_tracing:
        def callf(*args,**kwargs):
            debug_log.write("Calling %s: %s, %s\n" % 
                (func.__name__, args, kwargs))
            r = func(*args,**kwargs) #????????
            debug_log.write("%s returned %s\n" % (func.__name, r))
            return r
        return callf
    else:
        return func
4

1 に答える 1

0

*接頭辞は、「この一連の値を関数の位置パラメーターとして使用する」ことを意味します。**プレフィックスは、「このディクショナリを関数の名前付きパラメーターとして使用する」ことを意味します。シーケンスが空の場合、位置パラメータは渡されません。ディクショナリが空の場合、名前付きパラメータは渡されません。

これらのプレフィックスを使用して関数を定義すると、説明されていない位置パラメーターは*-プレフィックス付き引数に入れられ、説明されていない名前付きパラメーターは**-プレフィックス付き引数に入れられます。したがって、次のような関数を定義すると、次のようになります。

def wrapper(*args, **kwargs):

次に、関数は任意の引数を使用して呼び出すことができます。次に、その関数がそれらの引数を使用して別の関数を呼び出すと、ラッパーが呼び出されても呼び出されます。

(*args, **kwargs)そのように定義されていなくても、で関数を呼び出すことができることに注意してください。

>>> def square(x):
...     return x*x
...
>>> args = (10,)
>>> kwargs = {}
>>> square(*args, **kwargs)
100

kwargsは空であるため、関数に渡される名前付きパラメーターはありません。argsで1つの位置引数のみを取得します。

于 2013-01-19T13:09:40.633 に答える