Apakah Python memiliki sesuatu seperti variabel string kosong yang dapat Anda lakukan:
if myString == string.empty:
Apapun, apa cara paling elegan untuk memeriksa nilai string kosong? Saya menemukan coding sulit ""
setiap kali untuk memeriksa string kosong tidak sebagus.
python
string
comparison-operators
Joan Venge
sumber
sumber
""
tidak sebagus itu?Jawaban:
String kosong adalah "falsy" yang berarti mereka dianggap salah dalam konteks Boolean, jadi Anda bisa melakukan ini:
Ini adalah cara yang disukai jika Anda tahu bahwa variabel Anda adalah string. Jika variabel Anda juga bisa menjadi tipe lain maka Anda harus menggunakan
myString == ""
. Lihat dokumentasi tentang Pengujian Nilai Kebenaran untuk nilai-nilai lain yang salah dalam konteks Boolean.sumber
if not myString:
blok jikamyString
tidakNone
,0
,False
dll Jadi jika Anda tidak yakin apa jenismyString
, Anda harus menggunakanif myString == "":
untuk menentukan apakah itu adalah string kosong sebagai lawan beberapa nilai palsu lainnya.if myString == ...
ekspresi, kita bisa menggunakanif myString in (None, '')
atau per @Bartek,if myString in (None, '') or not myString.strip()
Dari PEP 8 , di bagian “Rekomendasi Pemrograman” :
Jadi, Anda harus menggunakan:
atau:
Hanya untuk memperjelas, urutan dievaluasi ke
False
atauTrue
dalam konteks Boolean jika mereka kosong atau tidak. Mereka tidak sama denganFalse
atauTrue
.sumber
x == False
. Tapi IMHO klarifikasi masih diterima mengingat target audiens.Cara yang paling elegan mungkin hanya dengan memeriksa apakah benar atau salah, misalnya:
Namun, Anda mungkin ingin menghapus ruang putih karena:
Anda mungkin harus sedikit lebih eksplisit dalam hal ini, kecuali Anda tahu pasti bahwa string ini telah melewati semacam validasi dan merupakan string yang dapat diuji dengan cara ini.
sumber
Saya akan menguji ketimpangan sebelum stripping. Juga, saya akan menggunakan fakta bahwa string kosong adalah False (atau Falsy). Pendekatan ini mirip dengan Apache StringUtils.isBlank atau Guava's Strings.isNullOrEmpty
Inilah yang akan saya gunakan untuk menguji apakah string adalah Tidak Ada ATAU Kosong ATAU Kosong:
Dan, kebalikan yang tepat untuk menguji jika sebuah string bukan None atau Kosong atau Kosong:
Bentuk kode di atas yang lebih ringkas:
sumber
if mystring and not mystring.strip()
?string and not string.isspace()
?def isBlank(s): return not (s and s.strip())
dandef isNotBlank(s): return s and s.strip()
.Saya pernah menulis sesuatu yang mirip dengan jawaban Bartek dan terinspirasi javascript:
Uji:
sumber
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
Satu-satunya cara yang sangat solid untuk melakukan ini adalah sebagai berikut:
Semua solusi lain memiliki kemungkinan masalah dan kasus tepi di mana pemeriksaan dapat gagal.
len(myString)==0
dapat gagal jikamyString
objek dari kelas yang mewarisi daristr
dan menimpa__len__()
metode.Demikian pula
myString == ""
danmyString.__eq__("")
dapat gagal jikamyString
menimpa__eq__()
dan__ne__()
.Untuk beberapa alasan
"" == myString
juga tertipu jikamyString
ditimpa__eq__()
.myString is ""
dan"" is myString
setara. Keduanya akan gagal jikamyString
sebenarnya bukan string tetapi subkelas string (keduanya akan kembaliFalse
). Juga, karena mereka memeriksa identitas, satu-satunya alasan mengapa mereka bekerja adalah karena Python menggunakan String Pooling (juga disebut String Internment) yang menggunakan instance string yang sama jika diinternir (lihat di sini: Mengapa membandingkan string menggunakan '= = 'atau' apakah 'terkadang menghasilkan hasil yang berbeda? ). Dan""
diinternir dari awal di CPythonMasalah besar dengan pemeriksaan identitas adalah bahwa String Internment adalah (sejauh yang saya bisa temukan) bahwa itu tidak standar string mana yang diinternir. Itu artinya, secara teoritis
""
tidak perlu diinternir dan itu tergantung implementasi.Satu-satunya cara untuk melakukan hal ini yang benar-benar tidak bisa tertipu adalah salah satu yang disebutkan di awal:
"".__eq__(myString)
. Karena ini secara eksplisit menyebut__eq__()
metode string kosong itu tidak dapat dibodohi dengan mengesampingkan metode apa pun di myString dan secara solid bekerja dengan subclass daristr
.Juga mengandalkan kepalsuan string mungkin tidak berfungsi jika objek menimpa
__bool__()
metode itu.Ini bukan hanya pekerjaan teoretis tetapi mungkin sebenarnya relevan dalam penggunaan nyata karena saya telah melihat kerangka kerja dan perpustakaan subkelas
str
sebelumnya dan menggunakanmyString is ""
mungkin mengembalikan output yang salah di sana.Juga, membandingkan penggunaan string
is
secara umum adalah jebakan yang cukup jahat karena kadang-kadang akan berfungsi dengan benar, tetapi tidak di waktu lain, karena penggabungan string mengikuti aturan yang cukup aneh.Yang mengatakan, dalam banyak kasus semua solusi yang disebutkan akan bekerja dengan benar. Ini adalah posting sebagian besar karya akademis.
sumber
Tes string kosong atau kosong (cara yang lebih pendek):
sumber
myString = None
, itu akan memunculkan pengecualian. Lebih baik gunakan jawabanJika Anda ingin membedakan antara string kosong dan nol, saya sarankan menggunakan
if len(string)
, jika tidak, saya sarankan menggunakan hanyaif string
seperti yang orang lain katakan. Peringatan tentang string penuh spasi masih berlaku, jadi jangan lupastrip
.sumber
if stringname:
memberifalse
ketika string kosong. Saya kira itu tidak bisa lebih sederhana dari ini.sumber
Pendekatan kode bersih
Melakukan ini:
foo == ""
adalah praktik yang sangat buruk.""
adalah nilai magis. Anda tidak boleh mengecek nilai magis (lebih dikenal sebagai angka ajaib )Yang harus Anda lakukan adalah membandingkan dengan nama variabel deskriptif.
Nama variabel deskriptif
Orang mungkin berpikir bahwa "empty_string" adalah nama variabel deskriptif. Bukan itu .
Sebelum Anda pergi dan melakukan
empty_string = ""
dan berpikir Anda memiliki nama variabel yang bagus untuk dibandingkan. Ini bukan apa yang dimaksud dengan "nama variabel deskriptif".Nama variabel deskriptif yang baik didasarkan pada konteksnya. Anda harus berpikir tentang apa string kosong itu .
Contoh bidang formulir sederhana
Anda sedang membangun formulir di mana pengguna dapat memasukkan nilai. Anda ingin memeriksa apakah pengguna menulis sesuatu atau tidak.
Nama variabel yang baik mungkin
not_filled_in
Ini membuat kode sangat mudah dibaca
Contoh parsing CSV menyeluruh
Anda mem-parsing file CSV dan ingin string kosong diuraikan sebagai
None
(Karena CSV sepenuhnya berbasis teks, ia tidak dapat mewakili
None
tanpa menggunakan kata kunci yang ditentukan sebelumnya)Nama variabel yang baik mungkin
CSV_NONE
Ini membuat kode mudah diubah dan diadaptasi jika Anda memiliki file CSV baru yang mewakili
None
dengan string lain selain""
Tidak ada pertanyaan tentang apakah kode ini benar. Cukup jelas bahwa ia melakukan apa yang seharusnya dilakukan.
Bandingkan ini dengan
Pertanyaan pertama di sini adalah, Mengapa senar kosong pantas mendapat perlakuan khusus?
Ini akan memberi tahu coders masa depan bahwa string kosong harus selalu dianggap sebagai
None
.Ini karena menggabungkan logika bisnis (Nilai CSV apa yang seharusnya
None
) dengan implementasi kode (Apa yang sebenarnya kita bandingkan)Perlu ada pemisahan kekhawatiran di antara keduanya.
sumber
""
bukan nilai sihir, sama denganTrue
,False
atauNone
bukan nilai sihir.sumber
a='a'
Anda akan mendapatkana.isspace() -> False
, tetapia
tidak akan menjadi string kosong pada akun itu.Bagaimana dengan ini? Mungkin itu bukan "yang paling elegan", tetapi tampaknya cukup lengkap dan jelas:
sumber
Menanggapi @ 1290. Maaf, tidak ada cara untuk memformat blok dalam komentar. The
None
nilai bukanlah string kosong di Python, dan tidak adalah (spasi). Jawaban dari Andrew Clark adalah yang benar:if not myString
. Jawaban dari @rouble khusus untuk aplikasi dan tidak menjawab pertanyaan OP. Anda akan mendapat masalah jika Anda mengadopsi definisi khusus tentang apa yang merupakan string "kosong". Secara khusus, perilaku standar adalah yangstr(None)
menghasilkan'None'
, string yang tidak kosong.Namun jika Anda harus memperlakukan
None
dan (spasi) sebagai string "kosong", berikut adalah cara yang lebih baik:Contoh:
Memenuhi persyaratan @rouble sambil tidak melanggar
bool
perilaku string yang diharapkan .sumber
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Saya menemukan ini elegan karena memastikan itu adalah string dan memeriksa panjangnya:
sumber
-O
flag atau mengaturPYTHONOPTIMIZE
variabel env.Cara mudah lainnya adalah dengan mendefinisikan fungsi sederhana:
sumber
Ungkapan ini Benar untuk string yang kosong. String tidak kosong, Tidak ada dan objek non-string semua akan menghasilkan False, dengan peringatan bahwa objek dapat menimpa __str__ untuk menggagalkan logika ini dengan mengembalikan nilai falsy.
sumber
Anda mungkin melihat ini nilai Menetapkan kosong atau string dengan Python
Ini tentang membandingkan string yang kosong. Jadi, alih-alih menguji kekosongan dengan
not
, Anda dapat menguji apakah string Anda sama dengan string kosong dengan""
string kosong ...sumber
bagi mereka yang mengharapkan perilaku seperti apache StringUtils.isBlank atau Guava Strings.isNullOrEmpty :
sumber
Ketika Anda membaca file dengan baris dan ingin menentukan, baris mana yang kosong, pastikan Anda akan menggunakannya
.strip()
, karena ada karakter baris baru di baris "kosong":sumber
sumber
Jika Anda hanya menggunakan
tidak mungkin untuk membedakan variabel yang boolean
False
dari string kosong''
:Namun, jika Anda menambahkan kondisi sederhana ke skrip Anda, perbedaan dibuat:
sumber
Dalam hal ini berguna bagi seseorang, berikut adalah fungsi cepat yang saya buat untuk mengganti string kosong dengan N / A dalam daftar daftar (python 2).
Ini berguna untuk mem-posting daftar daftar ke database mysql yang tidak menerima kosong untuk bidang tertentu (bidang ditandai sebagai NN dalam skema. Dalam kasus saya, ini karena kunci primer komposit).
sumber
Saya melakukan beberapa percobaan dengan string seperti '', '', '\ n', dll. Saya ingin isNotWhitespace menjadi Benar jika dan hanya jika variabel foo adalah string dengan setidaknya satu karakter non-spasi putih. Saya menggunakan Python 3.6. Inilah yang akhirnya saya dapatkan:
Bungkus ini dalam definisi metode jika diinginkan.
sumber
Seperti prmatta diposting di atas, tetapi dengan kesalahan.
sumber
""
dan" "
dan Salah untuk"a"
(seperti yang diharapkan). Kode Anda mengembalikan yang sama, kecuali untuk string kosong mengembalikan Benar, apa yang seharusnya tidak.