0

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

class Wrapper(object):

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

    def callFuncs(self, *args):
        # call each function with its respective arguments

为了确保提供的参数正确配对,我指定参数必须为每个参数分组为元组。没有参数得到一个空元组。因此,如果我们有foo(a)and bar(b)bork()并且我们构造一个Wrapper这样的:

wrapper = Wrapper(foo, bork, bar)

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

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

很简单,我能应付。我可能会使用partials 所以我可以遍历每个元组并填写参数。我认为这甚至适用于变量 args。但是关键字参数呢?

>>> def mytest(*args, **kwargs):
...     print args, kwargs
... 
>>> mytest((1,),(),(bar=3))
  File "<stdin>", line 1
    mytest((1,),(),(bar=3))
                    ^
SyntaxError: invalid syntax

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

4

2 回答 2

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

应该可以正常工作

于 2013-07-01T19:24:52.477 回答
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})
于 2013-07-01T20:53:38.537 回答