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
,只让它们能够打印出调用中传递的所有内容。好的,非常酷。我认为这涉及到对我的接口的一些小的妥协(我希望它看起来和你通常传递参数时一样),但它使我实现起来非常简单。请参阅更新我的答案,了解一些可能对你的接口有帮助的内容。谢谢!请注意,使用添加的语法糖将带来一些额外的开销。。。