¿Hay alguna manera más pitonica de hacer esto?Manera pitónica de pasar argumentos de palabra clave en condicional
if authenticate:
connect(username="foo")
else:
connect(username="foo", password="bar", otherarg="zed")
¿Hay alguna manera más pitonica de hacer esto?Manera pitónica de pasar argumentos de palabra clave en condicional
if authenticate:
connect(username="foo")
else:
connect(username="foo", password="bar", otherarg="zed")
Se puede añadirlos a una lista de kwargs así:
connect_kwargs = dict(username="foo")
if authenticate:
connect_kwargs['password'] = "bar"
connect_kwargs['otherarg'] = "zed"
connect(**connect_kwargs)
Esto a veces puede ser útil cuando se tiene un complicado conjunto de opciones que se pueden pasar a una función. En este caso simple, creo que lo que tienes es mejor, pero esto podría considerarse más pythonic porque no repite username="foo"
dos veces como el OP.
Este enfoque alternativo también se puede usar, aunque solo funciona si sabe cuáles son los argumentos predeterminados. Tampoco lo consideraría muy "pitónico" debido a las cláusulas duplicadas if
.
password = "bar" if authenticate else None
otherarg = "zed" if authenticate else None
connect(username="foo", password=password, otherarg=otherarg)
+1 Yo habría publicado lo mismo. –
La opción 1 es buena, la opción 2 no. –
La opción 1 es más líneas y menos directa que la pregunta original =/ – Charlie
O, más concisamente:
connect(**(
{'username': 'foo', 'password': 'bar', 'otherarg': 'zed'}
if authenticate else {'username': 'foo'}
))
Sólo pensé en tirar mi sombrero en el anillo:
authenticate_kwargs = {'password': "bar", 'otherarg': "zed"} if authenticate else {}
connect(username="foo", **authenticate_kwargs)
La versión de la OP es en realidad bien en este caso donde el número de argumentos incondicionales es bajo en comparación con el número de argumentos condicionales. Esto se debe a que solo los argumentos incondicionales tienen que repetirse en ambas ramas de la construcción if-else. Sin embargo, a menudo me encuentro con el caso opuesto, es decir, el número de argumentos incondicionales es alto en comparación con el de los condicionales.
Esto es lo que yo uso:
connect(username="foo",
**(dict(password="bar", otherarg="zed") if authenticate else {}))
¿Qué pasa con lo que tienes? "No te repitas" es una buena regla a seguir, pero no si hace que tu código sea más complicado. –
No será mucho más complicado, por lo que valoro DRY sobre la complejidad en este caso. – ash