2010-10-15 4 views
71

В Python, как преобразовать список в * args?Преобразование списка в * args в Python

мне нужно знать, потому что функция

scikits.timeseries.lib.reportlib.Report.__init__(*args) 

хочет несколько time_series объектов, переданные в качестве * аргументов, в то время как у меня есть список объектов таймсерий.

Любая помощь очень ценится :)

ответ

116

Вы можете использовать оператор * перед тем итератора, чтобы развернуть его в вызове функции. Например:

timeseries_list = [timeseries1 timeseries2 ...] 
r = scikits.timeseries.lib.reportlib.Report(*timeseries_list) 

(обратите внимание на * перед timeseries_list)

Из python documentation:

Если синтаксис * выражение появляется в вызове функции, выражение должно вычисляться итератора. Элементы из этого итерабельного обрабатываются , как если бы они были дополнительными позиционными аргументами; если есть позиционные аргументы x1, ..., xN и выражение оценивается в последовательности y1, ..., yM, это эквивалентно вызову с позицией M + N аргументов x1, ..., xN, y1, ..., yM.

+4

Забыли это: http://docs.python.org/reference/expressions.html#calls –

1

*args просто означает, что функция принимает несколько аргументов, как правило, того же типа.

Отъезд this section в учебнике Python для получения дополнительной информации.

+0

Я думаю, что ОП уже знает об этом. Функция принимает несколько аргументов, но у них есть один список, который они хотят передать в виде нескольких аргументов. –

+0

@Bryan Oakley: Документы, которые я связал, чтобы объяснить, как это сделать. – intuited

+4

, в то время как это правда, то, как вы сформулировали свой ответ, кажется, что ссылка указывает на другое место. Я думаю, что ваш ответ будет более полезен, если вы перепечатаете его, чтобы адресовать распаковку, а не то, что означает * args. –

10

Да, используя * arg, передающий функцию args, команда python распаковывает значения в arg и передает ее функции.

так:

>>> def printer(*args): 
print args 


>>> printer(2,3,4) 
(2, 3, 4) 
>>> printer(*range(2, 5)) 
(2, 3, 4) 
>>> printer(range(2, 5)) 
([2, 3, 4],) 
>>>