Python ключевое слово args vs kwargs

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

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

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

а также

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

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

Спасибо, мат

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам