web-dev-qa-db-fra.com

Python: le moyen le plus idiomatique de convertir None en chaîne vide?

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)
116
Mark Harrison

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)
72
Triptych
def xstr(s):
    return '' if s is None else str(s)
123
SilentGhost

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) # -> ''
89
Vinay Sajip

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.

66
dorvak

return s or '' fonctionnera parfaitement pour votre problème déclaré!

52
Alex Martelli
def xstr(s):
   return s or ""
14
Krystian Cybulski

Manière fonctionnelle (one-liner)

xstr = lambda s: '' if s is None else s
7
Dario
def xstr(s):
    return {None:''}.get(s, s)
6
tobidope

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 '')
4

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 ''
4
Peter Ericson

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.

3
radtek

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.

1
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))
1
phillc

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)
0
maciek

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 '')
0
sharjeel