Dengan asumsi connectionDetails
adalah kamus Python, apa cara terbaik untuk mengembalikan kode seperti ini?
if "host" in connectionDetails:
host = connectionDetails["host"]
else:
host = someDefaultValue
python
dictionary
coding-style
mnowotka
sumber
sumber
if/else
jauh lebih cepat. Itu mungkin atau mungkin tidak berperan.if/else
lebih cepat?Anda juga dapat menggunakan
defaultdict
seperti ini:Anda dapat melewati fungsi biasa alih-alih lambda:
sumber
get
atau metode serupa.Meskipun
.get()
ini adalah ungkapan yang bagus, ini lebih lambat daripadaif/else
(dan lebih lambat daripadatry/except
jika kehadiran kunci dalam kamus dapat diharapkan sebagian besar waktu):sumber
if/then
akan lebih cepat. Kedua kasus memerlukan lookup kamus, dan kecuali seruanget()
ini begitu jauh lebih lambat, apa account lain untuk perlambatan?O(1)
terlepas dari ukuran kamus, sehingga overhead panggilan fungsi relevan.Untuk beberapa standar yang berbeda coba ini:
sumber
None
atau BlankString sebagai salah satu nilai dalam pasangan nilai kunci. Thedefaults
kamus berpotensi memiliki salah satu dari nilai-nilai tidak sengaja blanked keluar. (lihat juga stackoverflow.com/questions/6354436 )Ada metode dalam kamus python untuk melakukan ini:
dict.setdefault
Namun metode ini menetapkan nilai
connectionDetails['host']
untuksomeDefaultValue
jika kuncihost
belum ditentukan, tidak seperti apa pertanyaan yang diajukan.sumber
setdefault()
nilai pengembalian, jadi ini bekerja dengan baik:host = connectionDetails.setdefault('host', someDefaultValue)
. Berhati-hatilah karena akan disetelconnectionDetails['host']
ke nilai default jika kunci tidak ada di sana sebelumnya.(ini jawaban yang terlambat)
Alternatifnya adalah dengan subkelas
dict
kelas dan mengimplementasikan__missing__()
metode, seperti ini:Contoh:
sumber
Menguji kecurigaan @Tim Pietzcker tentang situasi di PyPy (5.2.0-alpha0) untuk Python 3.3.5, saya menemukan bahwa memang keduanya
.get()
danif
/else
cara melakukan yang serupa. Sebenarnya sepertinya dalam kasus if / else bahkan hanya ada satu pencarian jika kondisi dan tugas melibatkan kunci yang sama (bandingkan dengan kasus terakhir di mana ada dua pencarian).sumber
Anda dapat menggunakan fungsi lamba untuk ini sebagai satu-liner. Buat objek baru
connectionDetails2
yang diakses seperti fungsi ...Sekarang gunakan
dari pada
yang mengembalikan nilai kamus jika
k
ada di tombol, jika tidak maka akan kembali"DEFAULT"
sumber