Питон сайта Аргументы против kwargs


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

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

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

И

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

Если нет, которые будут рассмотрены более подходящие для Python?

Спасибо, - Matt

3 2

3 ответа:

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

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

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

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

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