* аргументы обрабатываются как единственный аргумент

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

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) обрабатываются как один аргумент.

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


person CodeHard_or_HardCode    schedule 11.11.2013    source источник


Ответы (2)


Используя тот же синтаксис при применении последовательности 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
person Martijn Pieters    schedule 11.11.2013

Попробуйте это, распаковав список аргументов (также как его ):

function(*args)

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

range(3, 6)    # ok
range([3, 6])  # won't work
range(*[3, 6]) # it works!
person Óscar López    schedule 11.11.2013