比兹利4e P.E.R:正方形(x),但他在包装内通过**kwargs?

2024-04-25 19:10:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这个例子取自Beazley,Python基本参考4e, 第101页。你知道吗

他怎么样了:

func(*args, **kwargs)

其中'func'是带1个参数的平方函数。年早些时候 他在这一章讨论了论点的位置和数目 必须在调用/定义中匹配,否则将引发TypeError。你知道吗

还有

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

trace返回'callf',因此这相当于写入:square=callf 这很好,因为square引用了一个新的函数对象,你可以 用*args, **kwargs来称呼它。但是,在callf他确实func(*args...

既然我们刚才让“正方形”指的是其他物体,那么 原来的广场可以进去吗?这是什么机制 玩?你知道吗

@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

Tags: 函数debuglogreturnifenabledeftrace
1条回答
网友
1楼 · 发布于 2024-04-25 19:10:20

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

定义带有这些前缀的函数时,未说明的位置参数将进入带前缀的*-参数,而未说明的命名参数将进入带前缀的**参数。所以如果你定义这样一个函数:

def wrapper(*args, **kwargs):

然后可以用任何参数调用函数。如果该函数随后使用这些参数调用另一个函数,则无论调用包装器的方式如何,都将调用该函数。你知道吗

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

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

由于kwargs为空,因此没有传递给函数的命名参数。它只获取args中的一个位置参数。你知道吗

相关问题 更多 >