这个例子取自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
*-前缀表示“使用此值序列作为函数的位置参数”。**-前缀表示“使用此字典作为函数的命名参数”。如果序列为空,则不传递任何位置参数。如果字典为空,则不传递命名参数。你知道吗
定义带有这些前缀的函数时,未说明的位置参数将进入带前缀的*-参数,而未说明的命名参数将进入带前缀的**参数。所以如果你定义这样一个函数:
然后可以用任何参数调用函数。如果该函数随后使用这些参数调用另一个函数,则无论调用包装器的方式如何,都将调用该函数。你知道吗
请注意,您可以使用
(*args, **kwargs)
调用函数,即使没有这样定义:由于kwargs为空,因此没有传递给函数的命名参数。它只获取args中的一个位置参数。你知道吗
相关问题 更多 >
编程相关推荐