Ради полноты, Вот альтернатива, которая все еще использует **kwargs
.
def foo(**kwargs):
start_index = kwargs.pop('start_index', STARTINDEX_DEFAULT)
end_index = kwargs.pop('end_index', ENDINDEX_DEFAULT)
if kwargs:
# Catch unexpected keyword arguments
raise TypeError("%r are invalid keyword arguments" % (kwargs.keys())
# Do something here...
Но , вы не должны использовать это, когда вы не совсемнужно, используйте обычные параметры со значениями по умолчанию (как в ответе Романа Боднарчука).
Случаи, когда вам может понадобиться это, когда вы также хотите использовать *args
, и вам нужен способ отличить аргументы ключевого слова отпроизвольно человек позиционные аргументы.использование **kwargs
таким образом заставляет аргументы ключевого слова передаваться как ключевые слова;Позиционный аргумент никогда не сможет найти свой путь в **kwargs
.
Другая причина заключается в том, что вы можете действительно различать параметр по умолчанию и явный параметр, который является значением по умолчанию.None
часто используется в качестве значения по умолчанию для аргументов, указывающих «аргумент не применяется», но иногда вам действительно нужно интерпретировать None
как нечто отличное от значения по умолчанию.Проверка наличия или отсутствия ключа в диктовке **kwargs
позволяет точно различать эти случаи.(Альтернативой является создание экземпляра подкласса object
, единственной целью которого является значение по умолчанию для конкретного аргумента этой конкретной функции)