En supposant qu'il connectionDetails
s'agit d'un dictionnaire Python, quelle est la façon la plus élégante, la plus "pythonique" de refactoriser du code comme celui-ci?
if "host" in connectionDetails:
host = connectionDetails["host"]
else:
host = someDefaultValue
python
dictionary
coding-style
mnowotka
la source
la source
if/else
est beaucoup plus rapide. Cela pourrait ou non jouer un rôle.if/else
est plus rapide?Vous pouvez également utiliser des éléments
defaultdict
similaires:Vous pouvez passer n'importe quelle fonction ordinaire au lieu de lambda:
la source
get
des méthodes similaires.Bien que ce
.get()
soit un bel idiome, il est plus lent queif/else
(et plus lent quetry/except
si la présence de la clé dans le dictionnaire peut être attendue la plupart du temps):la source
if/then
serait plus rapide. Les deux cas ont besoin d' une recherche dans le dictionnaire, et à moins que l'invocation deget()
est donc beaucoup plus lent, ce qui compte le reste du ralentissement?O(1)
indépendamment de la taille du dictionnaire, donc la surcharge d'appel de fonction est pertinente.Pour plusieurs valeurs par défaut différentes, essayez ceci:
la source
None
ou la emptyString comme l'une des valeurs des paires clé-valeur. Ledefaults
dictionnaire pourrait potentiellement avoir une de ses valeurs supprimée involontairement. (voir aussi stackoverflow.com/questions/6354436 )Il existe une méthode dans les dictionnaires python pour ce faire:
dict.setdefault
Cependant , cette méthode permet de définir la valeur
connectionDetails['host']
àsomeDefaultValue
si la cléhost
est pas déjà défini, contrairement à ce que la question posée.la source
setdefault()
valeur de retour, donc cela fonctionne aussi bien:host = connectionDetails.setdefault('host', someDefaultValue)
. Gardez juste à l'esprit qu'il sera régléconnectionDetails['host']
sur la valeur par défaut si la clé n'était pas là auparavant.(c'est une réponse tardive)
Une alternative consiste à sous-
dict
classer la classe et à implémenter la__missing__()
méthode, comme ceci:Exemples:
la source
En testant les soupçons de @Tim Pietzcker sur la situation dans PyPy (5.2.0-alpha0) pour Python 3.3.5, je trouve qu'en effet les deux
.get()
et leif
/else
way fonctionnent de manière similaire. En fait, il semble que dans le cas if / else, il n'y a même qu'une seule recherche si la condition et l'affectation impliquent la même clé (comparer avec le dernier cas où il y a deux recherches).la source
Vous pouvez utiliser une fonction lamba pour cela comme une ligne. Créez un nouvel objet
connectionDetails2
accessible comme une fonction ...Maintenant, utilisez
au lieu de
qui retourne la valeur du dictionnaire si
k
est dans les clés, sinon il retourne"DEFAULT"
la source