如何在python中返回函数参数args、kwargs
我想让用户指定一个函数将函数参数返回给另一个函数如何在python中返回函数参数args、kwargs,python,python-3.x,Python,Python 3.x,我想让用户指定一个函数将函数参数返回给另一个函数 def wrapper(func, arg_func, iters=10): for i in range(iters): args, kwargs = arg_func() f(*args, **kwargs) 这可能吗?当前,如果我从arg_func返回一个没有任何kwargs的元组,那么它会抱怨要解包的参数太多 wrapper(func=print, arg_func=lambda: (random
def wrapper(func, arg_func, iters=10):
for i in range(iters):
args, kwargs = arg_func()
f(*args, **kwargs)
这可能吗?当前,如果我从arg_func
返回一个没有任何kwargs
的元组,那么它会抱怨要解包的参数太多
wrapper(func=print, arg_func=lambda: (random.uniform(0.0, 1.0),))
ValueError: not enough values to unpack (expected 2, got 1)
您的
arg_func
需要返回两个元素的序列,第一个元素本身是序列,第二个元素是字典
下面是调用wrapper()
的一种方法。请注意,返回值的第一个元素是tuple(random.uniform(0.0,1.0))
,第二个元素是dictionary{'flush':True}
。这些值只是示例。使用适合您的代码的任何序列和字典
wrapper(func=print,
arg_func=lambda: ((random.uniform(0.0, 1.0),), {'flush':True}))
这里是另一个例子arg_func
返回两个位置参数,不返回关键字参数:
wrapper(func=print, arg_func=lambda: (("Hello","World"), {}))
你可以做一些额外的处理。差不多
args, *more_args = arg_func()
kwargs = more_args[0] if more_args else {}
(另外,如果您不使用3.x,则需要执行以下操作
x = arg_func()
a,k = (x[0] if len(x) else []), (x[1] if len(x) > 1 else {})
但是lambda只返回调用
uniform
的结果,您不从中返回任何其他内容,因此只有一个参数可以解包。确切地说,我猜lambs只是一个示例,但我不确定如何以args kwargs regardlessWell的形式返回任意参数。您需要一个实际返回它们的函数(一个列表和一个字典),提供一个不会导致错误行为的函数。我不确定您想对此做什么,但是如果您提供给arg_func的函数有一个返回两个变量(一个列表和一个字典)的return语句,然后这些值将按各自的顺序存储到args和kwargs中。@Neelik我理解。我试图说明用户提供的func
采用位置参数和关键字参数的情况。要使用arg_func
为func
生成参数,需要返回元组和dict但是,与关键字选项通常是函数调用的可选选项类似,我不想强制它们从arg_func
返回dict
,如果它们不必返回的话。我必须添加额外的flush kwarg吗?您需要添加额外的映射对象(空或不空)否则你会被**kwargs
咬到。不,你不需要'flush'
。我只是为了这个例子才使用它。如果你没有关键字参数要传递,就用{}
作为dict。我明白,如果没有必要,我宁愿不强迫用户传递任何dict