Beazley 4e P.E.R:square(x)但他在封套内传递** kwargs?

时间:2013-01-19 11:36:49

标签: python python-3.x

此示例取自Beazley,Python Essential Reference 4e, PG:101

他是怎么做的:

func(*args, **kwargs)

其中'func'是占用1个参数的square-function。早些时候 这一章他讨论了论点的位置和数量 必须在调用/定义中匹配,否则将引发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

1 个答案:

答案 0 :(得分:0)

* -prefix表示“使用此序列值作为函数的位置参数”。 ** - 前缀表示“使用此字典作为函数的命名参数”。如果序列为空,则不传递位置参数。如果字典为空,则不传递任何命名参数。

当您使用这些前缀定义函数时,未计入的位置参数将进入* -prefixed参数,而未指定的命名参数将进入** - 前缀参数。所以如果你定义一个这样的函数:

def wrapper(*args, **kwargs):

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

请注意,即使没有这样定义,您也可以使用(*args, **kwargs)调用函数:

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

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