Es posible que desee aceptar argumentos con nombres casi arbitrarios por una serie de razones, y eso es lo que el formulario **kw
le permite hacer.
La razón más común es pasar los argumentos directamente a alguna otra función que está envolviendo (los decoradores son un caso de esto, pero LEJOS de la única!) - en este caso, **kw
afloja el acoplamiento entre wrapper y wrappee, ya que el envoltorio no tiene que conocer o preocuparse por todos los argumentos de la víctima. Aquí es otra, completamente diferente razón:
d = dict(a=1, b=2, c=3, d=4)
si todos los nombres tenían que ser conocidos de antemano, entonces, evidentemente, este enfoque simplemente no podría existir, ¿verdad? Y por cierto, en su caso, me gusta mucho más esta forma de hacer un diccionario cuyas claves son cadenas literales a:
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
simplemente porque este último es bastante puntuacion-pesado y por lo tanto menos legible.
Cuando no se aplica ninguna de las excelentes razones para aceptar **kwargs
, no lo acepte: es así de simple. IOW, si no hay una buena razón para permitir que la persona que llama pase archivos adicionales con nombres arbitrarios, no permita que eso suceda; simplemente evite poner un formulario **kw
al final de la firma de la función en la declaración def
.
En cuanto a usando**kw
en una llamada, que le permite armar el conjunto exacto de argumentos con nombre que debe pasar, cada uno con valores correspondientes, en un diccionario, de forma independiente de un solo punto de llamada, a continuación, utilizar ese dict en el único punto de llamada. Compare:
if x: kw['x'] = x
if y: kw['y'] = y
f(**kw)
a:
if x:
if y:
f(x=x, y=y)
else:
f(x=x)
else:
if y:
f(y=y)
else:
f()
Incluso con sólo dos posibilidades (! Y de la clase muy simple), la falta de **kw
está haciendo aleady la segunda opción absolutamente insostenible e intolerable - sólo imaginar cómo se desarrolla cuando hay media docena de posibilidades, posiblemente en una interacción un poco más rica ... sin **kw
, la vida sería un infierno absoluto en tales circunstancias!
Piense en varargs en C - a veces no se puede saber cuáles serán sus argumentos. –
Por favor, no use la frase "mundo real" - es argumentativo. Dice que "todos los ejemplos que he visto hasta ahora son artificiales e inútiles, mi aplicación es el mundo real, tus ejemplos son un mundo de fantasía". Por favor, cambie su pregunta para eliminar el "mundo real". –
Solo alguien a quien le guste discutir pensaría que mi pregunta fue argumentativa. – meppum