Was ist der idiomatischste Weg, um Folgendes zu tun?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
Update: Ich nehme Tryptichs Vorschlag auf, str (s) zu verwenden, wodurch diese Routine für andere Typen als Strings funktioniert. Ich bin schrecklich beeindruckt von Vinay Sajips Lambda-Vorschlag, aber ich möchte meinen Code relativ einfach halten.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
aus einer Diktatsuche stammt, bei der der Schlüssel nicht gefunden wurde, verwenden Siedict.get(key, '')
Antworten:
Wenn Sie möchten, dass sich Ihre Funktion wie die
str()
integrierte Funktion verhält , aber eine leere Zeichenfolge zurückgibt, wenn das Argument Keine lautet, gehen Sie folgendermaßen vor:quelle
xstr = lambda s: '' if s is None else str(s)
if not s:
if s is None
not False == True
aberFalse is None == False
.s
immer einen in str / unicode Typ oderNone
. Ja,False
ist ein Wert, aber ich bevorzuge diesen Weg, der meine Tastatur und Augen rettet;)quelle
return s is not None and s or ''
... and .. or ..
fehlschlägt und warum if-else bevorzugt wird. Es gibt zwei subtile Fehlers is not None and s or ''
.return '' if not s else str(s)
Wahrscheinlich wäre das kürzeste
str(s or '')
Weil Keine falsch ist und "x oder y" y zurückgibt, wenn x falsch ist. Eine ausführliche Erläuterung finden Sie unter Boolesche Operatoren . Es ist kurz, aber nicht sehr explizit.
quelle
or
diesen Weg zus
0, Falsch oder ein falscher Wert ist''
iff sein solls is None
. Alle anderen Eingaben sollten zurückgegeben werdens
(oderstr(s)
in der überarbeiteten Anfrage).s
istNone
, das Ergebnisxstr()
sollte ein leerer String sein, aberstr(None)
gibt die Zeichenfolge"None"
, die ist , was zurückgegeben wird (da die Zeichenfolge"None"
kein falsy Wert.Wenn Sie wissen, dass der Wert immer entweder eine Zeichenfolge oder Keine ist:
quelle
[]
,{}
usw. gibt das gleiche Ergebnis wieNone
, was nicht erwünscht ist.xstr(False)
insbesondere sollte"False"
statt sein""
. Der Missbrauch von Lambdas ist ein schlechtes Beispiel. Verwendendef xstr(s): return s or ""
Sie ir, um alles in einer Zeile zu halten.return s or ''
funktioniert gut für Ihr angegebenes Problem!quelle
s = False
oders = 0
wäre höchstwahrscheinlich ein Randfall in seiner Verwendung und könnte leicht gemildert werden, indem man es alsreturn str(s or '')
quelle
''
für0
,[]
,{}
,False
und falsch wie Werte, das ist nicht das, was das Plakat gefragt.def xstr(s): return str(s) or ""
Funktionsweise (Einzeiler)
quelle
Ein ordentlicher Einzeiler, um dieses Gebäude auf einigen der anderen Antworten aufzubauen:
oder auch nur:
quelle
(lambda v: v or '')
?False
leere Liste ebenfalls auf '' gesetzt wird.0
usw.quelle
get
.Ich benutze die Max-Funktion:
Funktioniert wie ein Zauber;) Setzen Sie einfach Ihren String in den ersten Parameter der Funktion.
quelle
Variation oben, wenn Sie mit Python 2.4 kompatibel sein müssen
quelle
Wenn es darum geht, Zeichenfolgen zu formatieren, können Sie Folgendes tun:
quelle
quelle
In den unten erläuterten Szenarien können wir Typumwandlungen immer vermeiden.
Im obigen Beispiel wird für den Fall, dass der Wert des variablen Kunden None ist, das Casting weiter ausgeführt, während er dem Namen zugewiesen wird. Der Vergleich in der 'if'-Klausel schlägt immer fehl.
Das obige Beispiel funktioniert ordnungsgemäß. Solche Szenarien sind sehr häufig, wenn Werte von URL, JSON oder XML abgerufen werden oder sogar Werte für jede Manipulation eine weitere Typumwandlung benötigen.
quelle
Kurzschlussauswertung verwenden:
Da + keine sehr gute Operation für Zeichenfolgen ist, sollten Sie Formatzeichenfolgen besser verwenden:
quelle
+
ist ein perfekter Operator für zwei Saiten. Wenn Sie versuchen, damit Dutzenden beizutreten, haben Sie Probleme. Für zwei wird es wahrscheinlich schneller sein als andere Optionen; In jedem Fall liegt es im Lärm.or
) scheint mir ein bisschen übertrieben zu sein ... Ich habe keine Fälle von anderen falschen Werten - entweder str oder None. Abgesehen von dem Kommentar zum+
Betreiber, der möglicherweise von einem bestimmten Szenario abhängt und ein Benchmarking erfordert , verdient diese Antwort keinen -1Verwenden Sie die F-Zeichenfolge, wenn Sie Python v3.7 verwenden
quelle
'None'
wenn dies der Falls
istNone
.