В частности, когда у вас есть одна функция, которая вызывает другую функцию, но подпись второй функции неизвестна.Как вы прозрачно передаете аргументы через функцию в python?
Я знаю, что вы можете использовать * 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)
Как написать метод, который вызывает другой метод, который всегда работает, когда подпись метода, который будет вызываться, является un известно только во время выполнения?
Ого, вы сделали совершенно ужасную работу, объясняя поэтому я добавил еще одну ссылку в качестве альтернативного ответа, но спасибо, это действительно то, что было неправильно. – Doug