У меня есть такие данные:
args, kwargs = (('foo', 'bar', 'baz'), {'goo': 1})
И у меня есть функции внутри объекта, которым нужны эти данные в качестве аргументов. Они должны быть предоставлены через метод, который имеет такую подпись (представленную как *args
):
callFunctions((*args, **kwargs), ...)
Или, более точно, в его структуре:
callFunctions(((args ...), {kwargs ...}), ...)
(Надеюсь, достаточно ясно, что я ожидаю от этого метода.)
Скажем, для примера, что мои две функции следующие:
def func1(foo, bar):
print foo, bar
def func2(baz, goo=0):
print baz, goo
funcs = func1, func2 # for iteration
На этом фоне у меня есть две проблемы.
Получение формата *args
, **kwargs
для каждой функции
Я пытался использовать модуль inspect
, чтобы получить спецификацию аргумента для каждой функции, чтобы я мог «заполнить» структуру данными 1d в args
и kwargs
. Я пробовал следующее:
format = [(spec.args, spec.keywords) for spec in (inspect.getargspec(func) for func in funcs)]
Но я не понимаю, почему spec.keywords
всегда дает мне None
(казалось бы идиотским). Значение по умолчанию любого аргумента ключевого слова будет отображаться в spec.defaults
, но я не знаю, как связать его с правильным аргументом ключевого слова. (Также расстраивает то, что все аргументы ключевого слова помещаются в spec.args
. )
[(['foo', 'bar'], None), (['baz', 'goo'], None)]
Заполнение структуры для передачи callFunctions
Предполагая, что у меня все равно есть структура, заполнение этой структуры исходными данными является сложной задачей: по сути, я хочу заполнить первый кортеж *args, **kwargs
первыми, сколько угодно, позиционными аргументами и соответствующими аргументами ключевого слова; затем перейдите к следующему кортежу со следующим количеством позиционных аргументов и соответствующими аргументами ключевого слова; и так далее. Я пробовал следующее:
argues = []
positional_index = 0
format = ((('foo', 'bar'), {}), (('baz',), {'goo': 0}))
for pair in format:
however_many = len(pair[0])
argues.append((tuple(args[positional_index:however_many]), dict({(k, kwargs[k]) for k in pair[1]})))
positional_index += however_many
Но я получаю это:
[(('foo', 'bar'), {}), ((), {'goo': 1})]
Почему я не получаю baz
?
('foo', 'bar'), {}
и('baz',), {'goo': 0}
, зачем вам дальнейшая обработка? Каждая из этих пар уже является набором аргументов для одной функции, поэтому вы можете просто перебирать их и передавать каждую. - person BrenBarn   schedule 10.07.2013args
иkwargs
с тем же именем, что и аргументы в двух функциях, но они могут быть любыми. Например, предоставленноеargs, kwargs
в самом начале моего вопроса может быть((1, 2, 3), {'hello':'world'})
. - person 2rs2ts   schedule 10.07.2013