Si bien la mayoría de las respuestas dicen eso, por ejemplo,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
es lo mismo que"
def f(foo=None, bar=None, **kwargs):
...etc...
esto no es verdad. En este último caso, f
puede ser llamado como f(23, 42)
, mientras que el primer caso acepta argumentos con nombre sólo - no hay llamadas posicionales. A menudo, desea permitir que la persona que llama tenga la máxima flexibilidad y, por lo tanto, es preferible la segunda forma, como afirman la mayoría de las respuestas: pero ese no es siempre el caso. Cuando acepta muchos parámetros opcionales, de los cuales generalmente solo se pasan unos pocos, puede ser una excelente idea (¡evitar accidentes y códigos ilegibles en sus sitios de llamadas!) Forzar el uso de argumentos con nombre, threading.Thread
es un ejemplo. La primera forma es cómo implementar eso en Python 2.
El idioma es tan importante que en Python 3 ahora tiene una sintaxis de soporte especial: cada argumento después de un solo *
en la def
firma es solo de palabra clave, es decir, no se puede pasar como un argumento posicional, sino solo como uno con nombre. Entonces, en Python 3 podría codificar lo anterior como:
def f(*, foo=None, bar=None, **kwargs):
...etc...
De hecho, en Python 3 incluso puede tener argumentos de solo palabras clave que no son opcionales (los que no tienen un valor predeterminado).
Sin embargo, Python 2 todavía tiene largos años de vida productiva por delante, por lo que es mejor no olvidar las técnicas y expresiones idiomáticas que le permiten implementar en Python 2 ideas de diseño importantes que se admiten directamente en el lenguaje de Python 3.