此示例取自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
答案 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中的一个位置参数。