Jaki jest najbardziej idiomatyczny sposób na wykonanie następujących czynności?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
aktualizacja: Włączam sugestię Trypticha, aby użyć str (s), co sprawia, że ta rutynowa działa dla innych typów oprócz ciągów. Jestem pod ogromnym wrażeniem sugestii lambda Vinaya Sajipa, ale chcę, aby mój kod był stosunkowo prosty.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
pochodzi z wyszukiwaniadict.get(key, '')
Odpowiedzi:
Jeśli faktycznie chcesz, aby Twoja funkcja zachowywała się jak funkcja
str()
wbudowana, ale zwracała pusty ciąg, gdy argument ma wartość None, zrób to:źródło
xstr = lambda s: '' if s is None else str(s)
if not s:
zamiastif s is None
not False == True
aleFalse is None == False
.s
zawsze typ in str / unicode lubNone
. Tak,False
to wartość, ale wolę taki sposób, który oszczędza klawiaturę i oczy;)źródło
return s is not None and s or ''
... and .. or ..
zawodzi i dlaczego preferowana jest opcja if-else. Istnieją dwa subtelne błędys is not None and s or ''
.return '' if not s else str(s)
Prawdopodobnie najkrótszy
str(s or '')
Ponieważ None jest fałszem, a „x lub y” zwraca y, jeśli x jest fałszywe. Aby uzyskać szczegółowe wyjaśnienie, zobacz Operatory boolowskie . Jest krótki, ale niezbyt wyraźny.
źródło
or
ten sposóbs
wynosi 0, False lub jakakolwiek fałszywa wartość''
iffs is None
. Wszystkie inne dane wejściowe powinny zostać zwrócones
(lubstr(s)
w poprawionym żądaniu).s
takNone
, wynikiemxstr()
powinien być pusty ciąg, alestr(None)
daje ciąg"None"
, który jest zwracany (ponieważ ciąg"None"
nie jest fałszywą wartością.Jeśli wiesz, że wartość zawsze będzie ciągiem lub None:
źródło
[]
, że{}
itp. Dają taki sam wynik jakNone
, co nie jest pożądane.xstr(False)
w szczególności powinno być"False"
zamiast""
. Nadużywanie lambd to kiepski przykład, użyjdef xstr(s): return s or ""
ir, jeśli chcesz, aby wszystko było w jednej linii.return s or ''
będzie działać dobrze dla podanego problemu!źródło
s = False
lubs = 0
najprawdopodobniej byłby skrajnym przypadkiem w jego użyciu i można go łatwo złagodzić, pisząc to jakoreturn str(s or '')
źródło
''
do0
,[]
,{}
,False
i fałszywie jak wartości, która nie ma co prosić o plakat.def xstr(s): return str(s) or ""
Funkcjonalny sposób (jedna linijka)
źródło
Zgrabna jedna linijka do zrobienia tego budynku na niektórych innych odpowiedziach:
lub po prostu:
źródło
(lambda v: v or '')
?False
pusta lista również zostanie zmieniona na „”.0
itd.źródło
get
.Używam funkcji max:
Działa jak urok;) Po prostu umieść swój napis w pierwszym parametrze funkcji.
źródło
Odmiana powyższego, jeśli chcesz być kompatybilny z Pythonem 2.4
źródło
Jeśli chodzi o formatowanie ciągów, możesz wykonać następujące czynności:
źródło
źródło
Zawsze możemy uniknąć rzutowania typów w scenariuszach opisanych poniżej.
W powyższym przykładzie, jeśli wartością zmiennej customer jest None, zostanie ona dalej rzutowana, gdy zostanie przypisana do 'name'. Porównanie w klauzuli „if” zawsze kończy się niepowodzeniem.
Powyższy przykład zadziała poprawnie. Takie scenariusze są bardzo powszechne, gdy wartości są pobierane z adresu URL, JSON lub XML, a nawet wartości wymagają dalszego rzutowania typów w celu dowolnej manipulacji.
źródło
Użyj oceny zwarcia:
Ponieważ + nie jest zbyt dobrą operacją na łańcuchach, lepiej użyj ciągów formatu:
źródło
+
to doskonały operator na dwa struny. Kiedy próbujesz użyć go do połączenia dziesiątek, masz kłopoty. Dla dwojga prawdopodobnie będzie to szybsze niż inne opcje; tak czy inaczej, jest w hałasie.or
) wydaje mi się trochę przesadą ... Nie mam przypadków innych fałszywych wartości - ani str, ani None. Poza komentarzem na temat+
operatora, który może zależeć od konkretnego scenariusza i może wymagać analizy porównawczej, ta odpowiedź nie zasługuje na -1Użyj ciągu F, jeśli używasz języka Python w wersji 3.7
źródło
'None'
jeślis
jestNone
.