具体的には、別の関数を呼び出す 1 つの関数があるが、2 番目の関数のシグネチャが不明な場合です。
*args と **kwargs をこれに似たものに使用できることは知っていますが、常に機能する方法で完全に正しく理解できないようです。
したがって、たとえば、次のようなものはほとんど機能します。
class Invoker():
def __init__(self, call):
self._call = call
def call(self, *args, **kwargs):
self._call(*args, **kwargs)
..しかし、いくつかのテストを書くと、次の出力が得られます。
1 -> 2 ('Hello')
1 -> 2 ((3, 'Hello'))
1 -> 2 ('Hello'), ({'left': 'right'})
1 -> 2 ((3,)), ({'value': 'Hello'})
call5() got multiple values for keyword argument 'value'
call5() got multiple values for keyword argument 'value'
このコードから:
# Known argument list: works fine
def call(x, y, value=None):
print("%d -> %d (%r)" % (x, y, value))
invoker = Invoker(call)
invoker.call(1, 2, value="Hello")
# Unknown argument list with no kwargs: works fine
def call2(x, y, *args):
print("%d -> %d (%r)" % (x, y, args))
invoker = Invoker(call2)
invoker.call(1, 2, 3, "Hello")
# Unknown kwargs with default value: works fine
def call3(x, y, value=None, **kwargs):
print("%d -> %d (%r), (%r)" % (x, y, value, kwargs))
invoker = Invoker(call3)
invoker.call(1, 2, value="Hello", left="right")
# Unknown args and kwargs: works fine
def call4(x, y, *args, **kwargs):
print("%d -> %d (%r), (%r)" % (x, y, args, kwargs))
invoker = Invoker(call4)
invoker.call(1, 2, 3, value="Hello")
# Default value with unknown args: fails
try:
def call5(x, y, value=None, *args):
print("%d -> %d (%r), (%r)" % (x, y, value, args))
invoker = Invoker(call5)
invoker.call(1, 2, 3, value="Hello")
except Exception, e:
print(e)
# Default value with unknown args and kwargs: fails
try:
def call6(x, y, value=None, *args, **kwargs):
print("%d -> %d (%r), (%r), (%r)" % (x, y, value, args, kwargs))
invoker = Invoker(call5)
invoker.call(1, 2, 3, value="Hello", left="right")
except Exception, e:
print(e)
実行時以外は呼び出されるメソッドのシグネチャが不明な場合、常に機能する別のメソッドを呼び出すメソッドを作成するにはどうすればよいですか?