Похоже, что многие аспекты python - это всего лишь дубликаты функциональности. Есть ли какая-то разница за пределами избыточности, которую я вижу в kwargs и dict внутри Python?
В чем разница между ** kwargs и dict в Python 3.2?
Ответ 1
Существует различие в распаковке аргументов (где многие используют kwargs
) и передают dict
в качестве одного из аргументов:
-
Использование распаковки аргументов:
# Prepare function def test(**kwargs): return kwargs # Invoke function >>> test(a=10, b=20) {'a':10,'b':20}
-
Передача dict в качестве аргумента:
# Prepare function def test(my_dict): return my_dict # Invoke function >>> test(dict(a=10, b=20)) {'a':10,'b':20}
Различия в основном:
- (вы можете просто передавать аргументы ключевого слова, даже если они явно не определены),
- гибкость (вы можете напрямую поддерживать некоторые аргументы ключевого слова, а остальные -
**kwargs
), Распаковка аргументов - помогает избежать непредвиденных изменений в объекте, содержащем "аргументы" (что менее важно, поскольку Python в целом предполагает, что разработчики знают, что они делают, это другая тема),
Ответ 2
Правильно, что в большинстве случаев вы можете просто обменивать dicts и ** kwargs.
Например:
my_dict = {'a': 5, 'b': 6}
def printer1(adict):
return adict
def printer2(**kwargs):
return kwargs
#evaluate:
>>> printer1(my_dict)
{'a': 5, 'b': 6}
>>> printer2(**my_dict)
{'a': 5, 'b': 6}
Однако с помощью kwargs у вас больше гибкости, если вы объедините его с другими аргументами:
def printer3(a, b=0, **kwargs):
return a,b,kwargs
#evaluate
>>> printer3(**my_dict)
(5, 6, {})