Apa yang dimaksud dengan "menggunakan prinsip EAFP" dengan Python? Bisakah Anda memberikan contoh?
python
principles
Oracle yang belum dibayar
sumber
sumber
Jawaban:
Dari glosarium :
Contohnya adalah upaya untuk mengakses kunci kamus.
EAFP:
try: x = my_dict["key"] except KeyError: # handle missing key
LBYL:
if "key" in my_dict: x = my_dict["key"] else: # handle missing key
Versi LBYL harus mencari kunci di dalam kamus dua kali, dan mungkin juga dianggap sedikit kurang dapat dibaca.
sumber
x
ketika kunci tidak ada:x = mydict.get('key')
akan kembaliNone
jika'key'
tidak adamy_dict
; Anda juga bisa melakukannya.get('key', <something>)
, dan kemudian x akan diberikan sesuatu jika kuncinya tidak ada dalam kamus.dict.setdefault()
dan jugacollections.defaultdict
merupakan hal yang baik untuk menghindari kelebihan kode.except KeyError
jugaAttributeError
sederhana tetapi beberapa contoh terburuk. Seringkali saya terjebak men-debug sesuatu karenaexcept AttributeError
diletakkan di tempat yang salah, yang akhirnya menangkap kesalahan atribut yang salah yang muncul lebih dalam di rantai. Contoh lebih baik saya pikir adalah:try: open() ... except: IOError
. Atautry: parseLine() ... except ParseError
Saya akan mencoba menjelaskannya dengan contoh lain.
Di sini kami mencoba mengakses file dan mencetak konten di konsol.
LBYL - Lihat Sebelum Anda Melompat:
Kami mungkin ingin memeriksa apakah kami dapat mengakses file dan jika kami bisa, kami akan membukanya dan mencetak isinya. Jika kami tidak dapat mengakses file, kami akan menekan
else
bagian tersebut. Alasan ini adalah kondisi balapan karena kami melakukan pengecekan akses terlebih dahulu. Pada saat kami mencapai,with open(my_file) as f:
mungkin kami tidak dapat mengaksesnya lagi karena beberapa masalah izin (misalnya, proses lain mendapatkan kunci file eksklusif). Kode ini kemungkinan besar akan memberikan kesalahan dan kami tidak akan dapat menangkap kesalahan itu karena kami pikir kami dapat mengakses file tersebut.import os my_file = "/path/to/my/file.txt" # Race condition if os.access(my_file, os.R_OK): with open(my_file) as f: print(f.read()) else: print("File can't be accessed")
EAFP - Lebih Mudah Meminta Pengampunan daripada Izin:
Dalam contoh ini, kami hanya mencoba membuka file dan jika kami tidak dapat membukanya, itu akan memunculkan
IOError
. Jika kami bisa, kami akan membuka file dan mencetak isinya. Jadi, alih-alih meminta sesuatu, kami mencoba melakukannya. Jika berhasil, bagus! Jika tidak, kami menangkap kesalahan dan menanganinya.# # No race condition try: f = open(my_file) except IOError as e: print("File can't be accessed") else: with f: print(f.read())
sumber
Saya menyebutnya "pemrograman optimis". Idenya adalah bahwa kebanyakan orang akan melakukan hal yang benar, dan kesalahan seharusnya sedikit. Jadi buat kode pertama untuk "hal yang benar" terjadi, dan kemudian tangkap kesalahan jika tidak.
Perasaan saya adalah bahwa jika pengguna akan membuat kesalahan, mereka harus menjadi orang yang menanggung konsekuensi waktu. Orang yang menggunakan alat dengan cara yang benar akan dipercepat.
sumber