Quelle est la manière la plus idiomatique de faire ce qui suit?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
mise à jour: J'incorpore la suggestion de Tryptich d'utiliser str (s), ce qui fait que cette routine fonctionne pour d'autres types en plus des chaînes. Je suis terriblement impressionné par la suggestion lambda de Vinay Sajip, mais je veux garder mon code relativement simple.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
provient d'une recherche de dict où la clé n'a pas été trouvée, utilisezdict.get(key, '')
Réponses:
Si vous voulez réellement que votre fonction se comporte comme la fonction
str()
intégrée, mais renvoyez une chaîne vide lorsque l'argument est Aucun, procédez comme suit:la source
xstr = lambda s: '' if s is None else str(s)
if not s:
au lieu deif s is None
not False == True
maisFalse is None == False
.s
toujours un type in str / unicode ouNone
. Oui,False
c'est une valeur mais je préfère cette façon qui sauve mon clavier et mes yeux;)la source
return s is not None and s or ''
... and .. or ..
échoue et pourquoi if-else est préféré. Il y a deux bugs subtilss is not None and s or ''
.return '' if not s else str(s)
Le plus court serait probablement
str(s or '')
Parce que None est False et que "x or y" renvoie y si x est false. Voir Opérateurs booléens pour une explication détaillée. C'est court, mais pas très explicite.
la source
or
cette façons
est 0, False ou toute valeur''
iffs is None
. Toutes les autres entrées doivent retourners
(oustr(s)
dans la demande révisée).s
estNone
, le résultat dexstr()
devrait être une chaîne vide, maisstr(None)
donne la chaîne"None"
, qui est ce qui est retourné (puisque la chaîne"None"
n'est pas une valeur fausse.Si vous savez que la valeur sera toujours une chaîne ou Aucune:
la source
[]
,{}
etc. donnent le même résultat queNone
, non désiré.xstr(False)
, en particulier, devrait être"False"
au lieu de""
. Abuser des lambdas est un mauvais exemple, utilisez sidef xstr(s): return s or ""
vous voulez tout garder sur une seule ligne.return s or ''
fonctionnera très bien pour votre problème déclaré!la source
s = False
ous = 0
serait très probablement un cas limite dans son utilisation et pourrait être facilement atténué en l'écrivant commereturn str(s or '')
la source
''
pour0
,[]
,{}
,False
et faux comme les valeurs, qui ne sont pas ce que l'affiche a demandé.def xstr(s): return str(s) or ""
Mode fonctionnel (one-liner)
la source
Un bon plan pour faire cette construction sur certaines des autres réponses:
ou même simplement:
la source
(lambda v: v or '')
?False
liste vide sera également transformée en «».0
, etc.la source
get
.J'utilise la fonction max:
Fonctionne comme un charme;) Mettez simplement votre chaîne dans le premier paramètre de la fonction.
la source
Variante sur ce qui précède si vous devez être compatible avec Python 2.4
la source
S'il s'agit de formater des chaînes, vous pouvez effectuer les opérations suivantes:
la source
la source
Nous pouvons toujours éviter la conversion de type dans les scénarios expliqués ci-dessous.
Dans l'exemple ci-dessus, dans le cas où la valeur de la variable client est None, elle est ensuite castée tout en étant affectée à 'nom'. La comparaison dans la clause «if» échouera toujours.
L'exemple ci-dessus fonctionnera correctement. De tels scénarios sont très courants lorsque les valeurs sont extraites de l'URL, du JSON ou du XML ou même que les valeurs nécessitent une conversion de type supplémentaire pour toute manipulation.
la source
Utilisez l'évaluation des courts-circuits:
Puisque + n'est pas une très bonne opération sur les chaînes, mieux vaut utiliser les chaînes de format:
la source
+
est un excellent opérateur pour deux cordes. C'est lorsque vous essayez de vous en servir pour rejoindre des dizaines que vous rencontrez des difficultés. Pour deux, ce sera probablement plus rapide que les autres options; de toute façon, c'est dans le bruit.or
) me semble un peu exagéré ... Je n'ai pas de cas d'autres valeurs fausses - soit str ou None. Mis à part le commentaire sur l'+
opérateur, qui pourrait dépendre d'un scénario spécifique et nécessiter un benchmarking, cette réponse ne mérite pas un -1Utilisez la chaîne F si vous utilisez python v3.7
la source
'None'
sis
c'estNone
.