Python ключевое слово args vs kwargs - PullRequest
2 голосов
/ 14 апреля 2011

Это может быть простой вопрос:

Есть ли разница между двумя следующими:

def myfunc(a_list = [], **kwargs):
    my_arg = kwargs.get('my_arg', None)
    pass

и

def myfucn(a_list = [], my_arg = None):
    pass

Если нет, то что будет считаться более питоническим?

Спасибо, Матф

Ответы [ 3 ]

7 голосов
/ 14 апреля 2011

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

Бонус: Никогда не инициализируйте список в определении функции!Это может привести к неожиданным результатам, поскольку оно будет сохраняться, поскольку списки изменчивы!

1 голос
/ 14 апреля 2011

Второй вариант позволяет передавать my_arg в качестве позиционного, а не ключевого аргумента.Я бы посчитал бессмысленным объявлять **kwargs, когда вы на самом деле их ни для чего не используете.

1 голос
/ 14 апреля 2011

Первый может принимать практически любой аргумент ключевого слова (независимо от того, что он использует только один из них), тогда как второй может принимать только два. Ни один не более Pythonic, вы просто используете тот, который подходит для задачи.

Кроме того, второе - это не «аргументы ключевых слов», а «значение по умолчанию».

...