0

後で呼び出されるように関数のコレクションをラップするクラスがあります。

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 = Wrapper(foo, bork, bar)

次に、次callFuncs()のように使用します。

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

簡単なことですが、私はそれを処理できます。おそらくpartials を使用して、各タプルを反復処理して引数を入力できるようにします。これは、変数の引数でも機能すると思います。しかし、キーワード引数はどうですか?

>>> 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

これらの線に沿ったものはどうですか:

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 に答える