Quelle est la manière la plus idiomatique de procéder comme suit?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
update: J'incorpore la suggestion de Tryptich d'utiliser str (s), ce qui permet à cette routine de fonctionner pour d'autres types que les 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)
Si vous voulez réellement que votre fonction se comporte comme le str()
intégré, mais renvoie une chaîne vide lorsque l'argument est Aucun, procédez comme suit:
def xstr(s):
if s is None:
return ''
return str(s)
def xstr(s):
return '' if s is None else str(s)
Si vous savez que la valeur sera toujours une chaîne ou None:
xstr = lambda s: s or ""
print xstr("a") + xstr("b") # -> 'ab'
print xstr("a") + xstr(None) # -> 'a'
print xstr(None) + xstr("b") # -> 'b'
print xstr(None) + xstr(None) # -> ''
Probablement le plus court serait str(s or '')
Parce que None est False et "x ou 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.
return s or ''
fonctionnera parfaitement pour votre problème déclaré!
def xstr(s):
return s or ""
Manière fonctionnelle (one-liner)
xstr = lambda s: '' if s is None else s
def xstr(s):
return {None:''}.get(s, s)
Un one-liner soigné pour faire ce bâtiment sur certaines des autres réponses:
s = (lambda v: v or '')(a) + (lambda v: v or '')(b)
ou même simplement:
s = (a or '') + (b or '')
Variation sur ce qui précède si vous devez être compatible avec Python 2.4
xstr = lambda s: s is not None and s or ''
J'utilise la fonction max:
max(None, '') #Returns blank
max("Hello",'') #Returns Hello
Fonctionne comme un charme;) Il suffit de mettre votre chaîne dans le premier paramètre de la fonction.
Nous pouvons toujours éviter le transtypage dans les scénarios expliqués ci-dessous.
customer = "John"
name = str(customer)
if name is None
print "Name is blank"
else:
print "Customer name : " + name
Dans l'exemple ci-dessus, dans le cas où la variable client a pour valeur None, elle est également diffusée tout en étant affectée à 'name'. La comparaison dans la clause 'if' échouera toujours.
customer = "John" # even though its None still it will work properly.
name = customer
if name is None
print "Name is blank"
else:
print "Customer name : " + str(name)
L'exemple ci-dessus fonctionnera correctement. De tels scénarios sont très courants lorsque des valeurs sont extraites à partir d'une URL, JSON ou XML, ou même que des valeurs nécessitent une transtypage supplémentaire pour toute manipulation.
def xstr(s):
return s if s else ''
s = "%s%s" % (xstr(a), xstr(b))
S'il ne s'agit que de formater des chaînes, vous pouvez procéder comme suit:
from string import Formatter
class NoneAsEmptyFormatter(Formatter):
def get_value(self, key, args, kwargs):
v = super().get_value(key, args, kwargs)
return '' if v is None else v
fmt = NoneAsEmptyFormatter()
s = fmt.format('{}{}', a, b)
Utilisez l'évaluation de court-circuit:
s = a or '' + b or ''
Puisque + n'est pas une très bonne opération sur les chaînes, mieux utiliser les chaînes de format:
s = "%s%s" % (a or '', b or '')