Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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 向包装函数传递(分组)关键字参数_Python_Python 2.7_Functional Programming_Arguments_Decorator - Fatal编程技术网

Python 向包装函数传递(分组)关键字参数

Python 向包装函数传递(分组)关键字参数,python,python-2.7,functional-programming,arguments,decorator,Python,Python 2.7,Functional Programming,Arguments,Decorator,我有一个类,它包装了一组函数,以便以后调用: class Wrapper(object): def __init__(self, *funcs): self.funcs = funcs def callFuncs(self, *args): # call each function with its respective arguments 为了确保所提供的参数正确配对,我指定每个参数必须按元组分组。没有参数获取空元组。因此,如果我们有foo

我有一个类,它包装了一组函数,以便以后调用:

class Wrapper(object):

    def __init__(self, *funcs):
        self.funcs = funcs

    def callFuncs(self, *args):
        # call each function with its respective arguments
为了确保所提供的参数正确配对,我指定每个参数必须按元组分组。没有参数获取空元组。因此,如果我们有
foo(a)
bar(b)
bork()
,我们构建了一个
包装器,如下所示:

wrapper = Wrapper(foo, bork, bar)
wrapper.callFuncs((a,),(),(b,))
然后我们会像这样使用
callFuncs()

wrapper = Wrapper(foo, bork, bar)
wrapper.callFuncs((a,),(),(b,))
很简单,我能处理。我可能会使用s,这样我就可以迭代每个元组并填充参数。我认为这甚至适用于变量args。但是关键字args呢

>>> def mytest(*args, **kwargs):
...     print args, kwargs
... 
>>> mytest((1,),(),(bar=3))
  File "<stdin>", line 1
    mytest((1,),(),(bar=3))
                    ^
SyntaxError: invalid syntax
>def mytest(*args,**kwargs):
...     打印args,kwargs
... 
>>>mytest((1,),(),(bar=3))
文件“”,第1行
mytest((1,),(),(bar=3))
^
SyntaxError:无效语法
如何为这些参数指定关键字

mytest((1,),(),dict(bar=3))

应该行得通

按照这些思路做点什么怎么样:

class Wrapper(object):
    def __init__(self, *funcs):
        self.funcs = funcs
    def call_funcs(self, *args):
        for func, args in zip(self.funcs, args):
            func(*args[0], **args[1])

def foo(*args, **kwargs):
    print 'foo(args={}, kwargs={})'.format(args, kwargs)

def bar(*args, **kwargs):
    print 'bar(args={}, kwargs={})'.format(args, kwargs)

def baz(*args, **kwargs):
    print 'baz(args={}, kwargs={})'.format(args, kwargs)

def bork(*args, **kwargs):
    print 'bork(args={}, kwargs={})'.format(args, kwargs)

wrapper = Wrapper(foo, bar, baz, bork)
wrapper.call_funcs(((), {}), ((1,), {}), ((), {'spam':3}), ((42,), {'dent':17}))
print

# to make using it easier and nicer looking, optionally include this:
params = lambda *args, **kwargs: (args, kwargs)

# then the same thing can be written:
wrapper.call_funcs(params(), params(1), params(spam=3), params(42, dent=17))
输出:

foo(args=(),kwargs={})
条形图(args=(1,),kwargs={})
baz(args=(),kwargs={'spam':3})
博克(args=(42,),kwargs={'dent':17})
foo(args=(),kwargs={})
条形图(args=(1,),kwargs={})
baz(args=(),kwargs={'spam':3})
博克(args=(42,),kwargs={'dent':17})

好的,现在我有了表示关键字args的
dict
,我如何使用它来指定
部分中的关键字args?文档显示您可以这样做:
basetwo=partial(int,base=2)
。在查看@martineau的答案后,我意识到我可以使用
**
来处理
dict
,非常感谢您的内置代码!相当巧妙!但是,我是否需要更改我的函数签名以及一些实现(例如,在开始时使用
foo(a)
变成
foo(*args)
执行
a=args[0]
)以进行补偿)?不过,如果这是我的最佳选择,我会接受它。只要函数的签名与您传递给每个函数的签名相匹配,我认为您不需要修改它们。我给了所有的示例函数
args
kwargs
,只让它们能够打印出调用中传递的所有内容。好的,非常酷。我认为这涉及到对我的接口的一些小的妥协(我希望它看起来和你通常传递参数时一样),但它使我实现起来非常简单。请参阅更新我的答案,了解一些可能对你的接口有帮助的内容。谢谢!请注意,使用添加的语法糖将带来一些额外的开销。。。