Suponiendo que connectionDetails
es un diccionario de Python, ¿cuál es la mejor, más elegante y más "pitónica" forma de refactorizar un código como este?
if "host" in connectionDetails:
host = connectionDetails["host"]
else:
host = someDefaultValue
python
dictionary
coding-style
mnowotka
fuente
fuente
if/else
es mucho más rápido. Eso podría o no jugar un papel.if/else
es más rápido?También puede usar el me
defaultdict
gusta así:Puede pasar cualquier función ordinaria en lugar de lambda:
fuente
get
métodos similares.Si bien
.get()
es un buen lenguaje, es más lento queif/else
(y más lento quetry/except
si la presencia de la clave en el diccionario se puede esperar la mayor parte del tiempo):fuente
if/then
sería más rápido. Ambos casos requieren una búsqueda de diccionario, ya menos que la invocación deget()
es manera mucho más lenta, lo que las cuentas de los demás por la desaceleración?O(1)
independiente del tamaño del diccionario, por lo que la sobrecarga de llamadas de función es relevante.Para múltiples valores predeterminados diferentes, intente esto:
fuente
None
o la emptyString como uno de los valores en los pares clave-valor. Eldefaults
diccionario podría potencialmente tener uno de sus valores borrados involuntariamente. (ver también stackoverflow.com/questions/6354436 )Hay un método en los diccionarios de Python para hacer esto:
dict.setdefault
Sin embargo, este método establece el valor de
connectionDetails['host']
asomeDefaultValue
si la clave aúnhost
no está definida, a diferencia de lo que se hizo la pregunta.fuente
setdefault()
el valor devoluciones, así que esto funciona así:host = connectionDetails.setdefault('host', someDefaultValue)
. Solo tenga en cuenta que se estableceráconnectionDetails['host']
en el valor predeterminado si la clave no estaba allí antes.(esta es una respuesta tardía)
Una alternativa es subclasificar la
dict
clase e implementar el__missing__()
método, así:Ejemplos:
fuente
Al probar la sospecha de @Tim Pietzcker sobre la situación en PyPy (5.2.0-alpha0) para Python 3.3.5, encuentro que, de hecho, ambos
.get()
yif
/else
way funcionan de manera similar. En realidad, parece que en el caso if / else hay incluso una sola búsqueda si la condición y la asignación involucran la misma clave (compárese con el último caso donde hay dos búsquedas).fuente
Puede usar una función lamba para esto como una línea. Cree un nuevo objeto al
connectionDetails2
que se acceda como una función ...Ahora usa
en vez de
que devuelve el valor del diccionario si
k
está en las claves; de lo contrario, devuelve"DEFAULT"
fuente