Кажется, что многие аспекты python - всего лишь дубликаты функциональности. Есть ли какая-то разница за пределами избыточности, которую я вижу в kwargs и dict внутри Python?В чем разница между ** kwargs и dict в Python 3.2?
ответ
Существует разница в аргументе распаковка (где многие люди используют 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 вообще предполагает, разработчики знают, что они делают, что это другая тема),
С распаковкой ключи должны быть действительными идентификаторами –
@gnibbler: Вы правы, +1. Я полностью пропустил это. В качестве примера я бы дал 'test ({0: 10, '0': 20})' (который вернет '{0: 10, '0': 20}'), который трудно заменить распаковкой аргумента. – Tadeck
Правильно, что в большинстве случаев вы можете просто обменять 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, {})
- 1. В чем разница между dict() и {}?
- 2. В чем разница между struct и dict?
- 3. dict (mapping, ** kwargs) vs dict (iterable, ** kwargs)
- 4. python: разница между списком (dict) и dict.keys()?
- 5. В чем разница между `` Ā` и в [:] `
- 6. В чем разница между ключом в dict & key в dict.keys()?
- 7. Разница между map и dict
- 8. В чем разница между «и» в python?
- 9. разница между набором python и dict «внутренне»
- 10. В чем разница в * args, ** kwargs против вызова с кортежем и dict?
- 11. В чем разница между типом и типом .__ new__ в python?
- 12. Разница между __getattribute__ и obj .__ dict __ ['x'] в python?
- 13. В чем разница между Django и Python?
- 14. Разница между не dict и not dict == {}
- 15. В чем разница между списком и итератором в Python?
- 16. В чем разница между QueryDict и MultiValueDict?
- 17. kwargs переопределяет Dict подкласс
- 18. Разница между python dict и tr1 :: unordered_map в C++
- 19. В чем разница между b и c?
- 20. В чем разница между «и»?
- 21. В чем разница между `{}` и `[]`?
- 22. В чем разница между == и ===?
- 23. В чем разница между «+» и «\ +»?
- 24. В чем разница между + = и = +?
- 25. В чем разница между/* ... */и/** ... */
- 26. В чем разница между: и +:
- 27. В чем разница между $ {} и # {}
- 28. В чем разница между $ _. и $ _
- 29. В чем разница между = и: =
- 30. В чем разница между && и &?
'** kwargs' неявно создает * а *' dict' объект (названный 'kwargs'), загруженный ключами и значениями. Это не дублирующаяся функциональность. –
Развернуть «многие аспекты». Какие еще области дублируют функциональность? – jdi