将(分组)关键字args传递给包装函数

时间:2013-07-01 19:22:13

标签: 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

为了确保提供的args正确配对,我指定必须将参数分组为每个参数的元组。没有参数获得空元组。因此,如果我们有foo(a)bar(b)以及bork(),我们就像这样构建Wrapper

wrapper = Wrapper(foo, bork, bar)

然后我们会这样使用callFuncs()

wrapper.callFuncs((a,),(),(b,))

很简单,我可以处理。我可能会使用partial 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

如何为这些参数指定关键字?

2 个答案:

答案 0 :(得分:1)

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

应该可以正常工作

答案 1 :(得分:1)

这些方面的内容如何:

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={})
bar(args=(1,), kwargs={})
baz(args=(), kwargs={'spam': 3})
bork(args=(42,), kwargs={'dent': 17})

foo(args=(), kwargs={})
bar(args=(1,), kwargs={})
baz(args=(), kwargs={'spam': 3})
bork(args=(42,), kwargs={'dent': 17})