2016-02-18 10 views
1

Допустим, у меня есть функцияПравильный способ пользователя * арг и инициализированными аргументов в функции питона

def fix_results(parameter_1 =True, *some_kind_of_iterable): 

    if parameter_1: 
     df = pd.DataFrame(i for i in some_kind_of_iterable if i['count'] == 1) 
    else: 
     df = pd.DataFrame(i for i in some_kind_of_iterable) 

    And the some piece of code for df. 

    return df 

Когда я запускаю это нравится:

fix_results(*some_results), 

он работает отлично. Но когда я пытаюсь запустить его как

fix_results(parameter_1=False,*some_results) 

я получаю эту ошибку:

TypeError: fix_results() got multiple values for keyword argument 'parameter_1' 

Что я делаю неправильно?

ответ

2

В Python 2, единственный способ вызвать эту функцию правильно с помощью *args аргумента передать parameter_1 в качестве позиционного параметра, т.е. без parameter_1= бита:

fix_results(False, *some_results) 

В Python 3, вы можете изменить вашу функцию определение и превратить parameter_1 в ключевом слове-единственный параметр:

def fix_results(*some_kind_of_iterable, parameter_1=True): 
    .... 

Эта функция может быть вызвана либо

fix_results(parameter_1=False, *some_results) 

или

fix_results(*some_results, parameter_1=False) 

Обратите внимание, что ваш вызов fix_results(*some_results), который вы утверждаете «прекрасно работает», вероятно, не делать то, что вы ожидаете, что делать: Первый элемент Iterable будет использоваться в качестве parameter_1 ,

Альтернатива в Python 2 было бы передать итерацию в качестве единственного параметра, а не использовать *args синтаксис:

def fix_results(some_kind_of_iterable, parameter_1=True): 
    .... 

Эта функция в настоящее время можно назвать так:

fix_results(some_results, parameter_1=False) 
+0

Итак, есть ли другой способ получить тот же результат, чтобы объявить, для чего является параметр_1? (Для python 2.7) –

+0

@GiorgosPerakis Я добавил альтернативу Python 2 для моего ответа. –

+0

Я хотел использовать * args вместо обычного аргумента. Но спасибо большое! –