2016-02-12 7 views
0

Я не уверен в точном способе формулировать вопрос, поскольку его проще просто продемонстрировать с помощью кода. Я хотел бы иметь функцию, которая принимает переменное число из набора из 3 необходимых и 1 необязательных аргументов. В качестве иллюстрации, matplotlib.pyplot.plot() может принимать любое количество значений (x, y, color). Я хотел бы скопировать это поведение, но я не уверен в правильном способе сделать это, используя * args или подобное. Ниже я иллюстрирую поведение, которое я бы хотел.Пропустить произвольное число набора переменных для функции Python

myFunc(name, lo, hi, step) # Do something 
myFunc(name, lo, hi, step, name2, low2, hi2, step2) # Do something for name and name2 
myFunc(name, lo, hi, name2, low2, hi2) # Same as above but use default step for both 

Единственный способ, которым я могу думать о том, чтобы проходные аргументах и ​​выполнить ряд проверок убедитесь, что он удовлетворяет тип для (name, lo, hi, step) и проверить, если step даже дан, но я хотел бы знать, если есть более эффективный способ сделать это.

Edit:

Я хотел выше поведение, так как моя функция использует первый набор для идентификации параметра и создать время цикла. Если осталось больше наборов параметров, он вызывает себя рекурсивно для построения вложенного цикла while с оставшимися параметрами и т. Д. Если дополнительных наборов не останется, он выполнит некоторое измерение данных и затем вернется. Таким образом, я могу прокрутить сколь угодно большое многомерное пространство, используя одну рекурсивную функцию.

+0

Возможно, вы хотите ** kwargs. Они позволят вам необязательные аргументы ключевых слов. –

+0

Есть части «matplotlib» api, которые я нахожу очень ужасными - это один из них. :-). В этом случае я бы рекомендовал, чтобы функция/метод вызывалась несколько раз с 3 обязательными и 1 необязательным аргументом. , , Это будет возможно для вашего случая использования? – mgilson

+0

Отметьте это сообщение: http://stackoverflow.com/questions/3394835/args-and-kwargs – Jaco

ответ

0

Что-то вроде этого, что вы ищете?

list_of_things = [('name', 'lo', 'hi', 'step'), 
        ('name2', 'lo2', 'hi2'), 
        ('name3', 'lo3', 'hi3', 'step3') 
] 
def myFunc(name, lo, hi, step='default'): 
           # do something 
def callMyFunc(x):  
    for i in x: 
     myFunc(*i)   # pass the contents of the tuple as arguments 

Если вы не хотите, чтобы кортеж заказанных товаров, вы должны назвать каждого из аргументов и представить их по имени.

+0

Сортировка, но мне нужна петля for внутри функции, так сказать. В основном я проверяю, сколько из кортежей у меня есть, и функция изменяется в зависимости от того, сколько было передано. Более конкретно, он обрабатывает первый набор, и если осталось больше кортежей, я рекурсивно вызываю функцию. – Snyder005

+0

Я отредактировал его, чтобы поместить цикл for внутри второй функции. Вызов этой функции со списком будет обрабатывать каждый кортеж один за другим. Исходя из вашего обновленного вопроса, это может не помочь. – jlbnjmn