Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中返回函数参数args、kwargs_Python_Python 3.x - Fatal编程技术网

如何在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