2012-06-14 3 views
2

Я знаю, что это работает очень хорошо:Pass два списка переменных аргументов

def locations(city, *other_cities): 
    print(city, other_cities) 

Теперь мне нужно два списка переменных аргументов, как

def myfunction(type, id, *arg1, *arg2): 
    # do somethong 
    other_function(arg1) 

    #do something 
    other_function2(*arg2) 

Но Python не позволяет использовать это дважды

+4

Можете ли вы привести пример того, как вы хотите вызвать функцию? –

+5

Как бы Python знал, должен ли аргумент быть в 'arg1' или' arg2', если оба являются переменными? –

ответ

10

Это невозможно, потому что *arg захватывает все позиционные args с этого положения сверху. Поэтому по определению второй *args2 всегда будет пустым.

Простое решение будет прохождение двух кортежей:

def myfunction(type, id, args1, args2): 
    other_function(args1) 
    other_function2(args2) 

и называют это так:

myfunction(type, id, (1,2,3), (4,5,6)) 

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

def myfunction(type, id, args1, args2): 
    other_function(*arg1) 
    other_function2(*arg2) 

Это будет иметь то преимущество, что вы можете использовать любой итерируемый, даже генератор, при вызове myfunction, так как вызываемые функции никогда не будут соприкасаться с переданными итерами.


Если вы действительно хотите работать с двумя списками переменных аргументов, вам нужен какой-то разделитель. Следующий код использует None в качестве разделителя:

import itertools 
def myfunction(type, id, *args): 
    args = iter(args) 
    args1 = itertools.takeuntil(lambda x: x is not None, args) 
    args2 = itertools.dropwhile(lambda x: x is None, args) 
    other_function(args1) 
    other_function2(args2) 

Он будет использоваться как это:

myfunction(type, id, 1,2,3, None, 4,5,6) 
+0

О, я попробую. –

+1

Да, любая итерабельность прекрасна до тех пор, пока 'other_function' не полагается на конкретное поведение, например. список или кортеж. – ThiefMaster

1

Вы можете использовать два словаря вместо.

+1

s/словари/списки или кортежи /. Дикты будут использоваться для kwargs, но он использует posargs. – ThiefMaster

+1

@ThiefMaster. Я не говорю о ** магии, а просто использую словари с параметрами. Я не знаю, почему автору нужно передать два позагорских списка – Ribtoks

Смежные вопросы