Parece que muchos aspectos de python son solo duplicados de funcionalidad. ¿Hay alguna diferencia más allá de la redundancia que estoy viendo en kwargs y dict dentro de Python?¿Cuál es la diferencia entre ** kwargs y dict en Python 3.2?
Respuesta
Hay una diferencia en el argumento de desempacar (donde muchas personas utilizan kwargs
) y que pasa dict
como uno de los argumentos:
Usando el argumento de desembalaje:
# Prepare function def test(**kwargs): return kwargs # Invoke function >>> test(a=10, b=20) {'a':10,'b':20}
El paso de un dict como un argumento:
# Prepare function def test(my_dict): return my_dict # Invoke function >>> test(dict(a=10, b=20)) {'a':10,'b':20}
Las diferencias son en su mayoría:
- facilidad de lectura (se puede simplemente pasar argumentos de palabras clave, incluso si no se definen explícitamente),
- flexibilidad (que puede soportar algunos argumentos clave explícita y el resto mediante
**kwargs
) , - argumento desembalaje le ayuda a evitar cambios inesperados en el objeto "que contiene" los argumentos (que es menos importante, ya que, en general, Python asume desarrolladores saben lo que están haciendo, que es un tema diferente),
Con desembalaje, las claves deben ser identificadores válidos –
@gnibbler: Tiene razón, +1. Eché de menos eso. Como ejemplo daría 'test ({0: 10, '0': 20})' (que devolverá '{0: 10, '0': 20}'), que es difícil de reemplazar con el desempaquetado de argumentos. – Tadeck
Es correcto que en la mayoría de los casos puede simplemente intercambiar dicts y ** kwargs.
Por ejemplo:
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}
Sin embargo, con kwargs que tenga más flexibilidad si se combina con otros argumentos:
def printer3(a, b=0, **kwargs):
return a,b,kwargs
#evaluate
>>> printer3(**my_dict)
(5, 6, {})
- 1. ¿Cuál es la diferencia entre dict() y {}?
- 2. Convirtiendo Python dict a kwargs?
- 3. Diferencia entre mapa y dict
- 4. En Python, ¿cuál es la diferencia entre pasar y devolver
- 5. La diferencia entre python dict y tr1 :: unordered_map en C++
- 6. Python: ¿Cuál es la diferencia entre __builtin__ y __builtins__?
- 7. ¿Cuál es la diferencia entre python activo y python?
- 8. diferencia entre eficiencia y dict.has_key clave en dict en Python
- 9. ¿Cuál es la diferencia entre listas y tuplas en Python?
- 10. ¿Cuál es la diferencia entre conjuntos y listas en Python?
- 11. ¿Cuál es la diferencia entre list y list [:] en python?
- 12. ¿Cuál es la diferencia entre {} y [] en python?
- 13. En Python, ¿cuál es la diferencia entre ".append()" y "+ = []"?
- 14. Objetivo-C: ¿Cuál es la diferencia entre forKey y forKeyPath?
- 15. Twisted (Python): ¿cuál es la diferencia entre cooperate y coiterate?
- 16. ¿Cuál es la diferencia entre pytz y python-dateutil?
- 17. ¿Cuál es la diferencia entre django classonlymethod y python classmethod?
- 18. ¿Cuál es la diferencia entre tipo y tipo .__ new__ en python?
- 19. ¿Cuál es la diferencia entre + = y = +?
- 20. ¿cuál es la diferencia entre:.! y: r !?
- 21. ¿Cuál es la diferencia entre ".equals" y "=="?
- 22. Cuál es la diferencia entre $ y jQuery
- 23. Cuál es la diferencia entre = y: =
- 24. Cuál es la diferencia entre $ (...) y `...`
- 25. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 26. ¿Cuál es la diferencia entre {0} y ""?
- 27. ¿Cuál es la diferencia entre .ToString (+) y ""
- 28. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 29. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 30. ¿Cuál es la diferencia entre " " y ""?
'** kwargs' crea implícitamente * a *' dict' objeto (nombrado por 'kwargs') cargado con claves y valores. Esto no es una funcionalidad duplicada. –
Expandir en "muchos aspectos". ¿Qué otras áreas son funciones duplicadas? – jdi