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 指的是一个新功能对象,你可以用*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

*-前缀的意思是,“使用这个值序列作为函数的位置参数”。**-前缀的意思是,“将此字典用作函数的命名参数。” 如果序列为空,则不传递位置参数。如果字典为空,则不传递命名参数。

当您使用这些前缀定义函数时,未说明的位置参数进入 *-prefixed 参数,未说明的命名参数进入 **-prefixed 参数。因此,如果您定义这样的函数:

def wrapper(*args, **kwargs):

然后可以使用任何参数调用该函数。如果该函数随后使用这些参数调用另一个函数,那么它将被调用,但是调用了包装器。

请注意,(*args, **kwargs)即使未以这种方式定义,您也可以调用函数:

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

因为 kwargs 是空的,所以没有传递给函数的命名参数。它只获得 args 中的一个位置参数。

于 2013-01-19T13:09:40.633 回答