Apa cara paling idiomatis untuk melakukan hal berikut?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
pembaruan: Saya memasukkan saran Tryptich untuk menggunakan str (s), yang membuat rutin ini berfungsi untuk jenis lain selain string. Saya sangat terkesan dengan saran lambda Vinay Sajip, tetapi saya ingin menjaga kode saya relatif sederhana.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
berasal dari pencarian dict di mana kunci tidak ditemukan, kemudian gunakandict.get(key, '')
Jawaban:
Jika Anda benar-benar ingin fungsi Anda berperilaku seperti
str()
built-in, tetapi mengembalikan string kosong ketika argumennya adalah None, lakukan ini:sumber
xstr = lambda s: '' if s is None else str(s)
if not s:
bukannyaif s is None
not False == True
tetapiFalse is None == False
.s
selalu dalam str / unicode type atauNone
. Ya,False
adalah nilai tetapi saya lebih suka cara ini yang menyelamatkan keyboard dan mata saya;)sumber
return s is not None and s or ''
... and .. or ..
gagal dan mengapa jika yang lain lebih disukai. Ada dua bug halus dis is not None and s or ''
.return '' if not s else str(s)
Mungkin yang terpendek adalah
str(s or '')
Karena Tidak Ada yang Salah, dan "x atau y" mengembalikan y jika x salah. Lihat Operator Boolean untuk penjelasan terperinci. Ini pendek, tetapi tidak terlalu eksplisit.
sumber
or
cara inis
0, False, atau nilai salah apa pun''
iffs is None
. Semua input lain harus dikembalikans
(ataustr(s)
dalam permintaan yang direvisi).s
adalahNone
, hasil darixstr()
harus string kosong, tetapistr(None)
memberikan string"None"
, yang adalah apa yang dikembalikan (karena string"None"
bukan nilai falsy.Jika Anda tahu bahwa nilainya akan selalu berupa string atau Tidak ada:
sumber
[]
,,{}
dll. Memberikan hasil yang sama sepertiNone
, yang tidak diinginkan.xstr(False)
, khususnya, seharusnya"False"
bukan""
. Menyalahgunakan lambdas sebagai contoh yang buruk, gunakandef xstr(s): return s or ""
ir yang ingin Anda pertahankan dalam satu jalur.return s or ''
akan bekerja dengan baik untuk masalah yang Anda nyatakan!sumber
s = False
ataus = 0
kemungkinan besar akan menjadi kasus tepi dalam penggunaannya dan dapat dengan mudah dikurangi dengan menuliskannya sebagaireturn str(s or '')
sumber
''
untuk0
,[]
,{}
,False
dan false-seperti nilai-nilai, yang tidak apa poster minta.def xstr(s): return str(s) or ""
Cara fungsional (satu-liner)
sumber
Satu lapis yang rapi untuk mengerjakan bangunan ini pada beberapa jawaban lain:
atau bahkan hanya:
sumber
(lambda v: v or '')
?False
dan daftar kosong juga akan berubah menjadi ''.0
, dll.sumber
get
.Saya menggunakan fungsi maks:
Bekerja seperti pesona;) Masukkan saja string Anda ke dalam parameter pertama dari fungsi.
sumber
Variasi di atas jika Anda harus kompatibel dengan Python 2.4
sumber
Jika ini tentang memformat string, Anda dapat melakukan hal berikut:
sumber
sumber
Kami selalu dapat menghindari tipe casting dalam skenario yang dijelaskan di bawah ini.
Dalam contoh di atas dalam kasus nilai pelanggan variabel adalah Tidak ada yang selanjutnya mendapatkan casting saat ditugaskan ke 'nama'. Perbandingan dalam klausa 'jika' akan selalu gagal.
Contoh di atas akan bekerja dengan baik. Skenario seperti itu sangat umum ketika nilai diambil dari URL, JSON atau XML atau bahkan nilai perlu pengecoran tipe lebih lanjut untuk manipulasi apa pun.
sumber
Gunakan evaluasi hubung singkat:
Karena + bukan operasi yang sangat baik pada string, lebih baik gunakan format string:
sumber
+
adalah operator yang sangat baik untuk dua string. Saat Anda mencoba menggunakannya untuk bergabung dengan lusinan Anda mengalami kesulitan. Untuk dua, mungkin akan lebih cepat daripada opsi lain; Bagaimanapun, itu dalam kebisingan.or
) tampaknya sedikit berlebihan bagi saya ... Saya tidak punya kasus nilai-nilai palsu lainnya - baik str atau Tidak ada. Selain dari komentar pada+
operator, yang mungkin tergantung pada skenario tertentu dan mungkin perlu benchmarking, jawaban ini tidak layak -1Gunakan string F jika Anda menggunakan python v3.7
sumber
'None'
jikas
adaNone
.