2013-11-11 7 views
0

Я пытаюсь сделать функцию, предназначенной для вызвать другую функцию несколько раз:* арг рассматривается как один аргумент

def iterator(iterations, function, *args): 
#called as: 
iterator(5, my_function, arg1, arg2, arg3) 

Обратите внимание, что количество аргументов здесь является переменным: 1 может, может быть 2, могут будет 10. заполнить их в зависимости от функции, которая вызывается.

def iterator(iterations, function, *args): 
    for i in range(iteration): 
    temp = function(args) 
    return temp 

Проблема состоит в следующем: TypeError: my_function() принимает ровно 4 аргументы (1 приведены)

И это потому, что (arg1, arg2, arg3, arg4) в настоящее время рассматривается в качестве единственного аргумента ,

Как мне обойти это?

ответ

4

Используя тот же синтаксис при применении в args последовательности:

temp = function(*args) 

*args синтаксиса здесь тесно связан с синтаксисом параметра в функции *args; вместо того, чтобы фиксировать произвольное количество аргументов, используя *args в , вызов расширяет последовательность до отдельных аргументов.

Вы можете быть заинтересованы, чтобы знать, что есть синтаксис **kwargs тоже, чтобы захватить и применить именованные аргументы:

def iterator(iterations, function, *args, **kwargs): 
    for i in range(iteration): 
     temp = function(*args, **kwargs) 
    return temp 
2

Попробуйте это, unpacking the argument list (ака splatting его):

function(*args) 

От пример в документации, вы увидите, что это то, что вам нужно:

range(3, 6) # ok 
range([3, 6]) # won't work 
range(*[3, 6]) # it works! 
Смежные вопросы