Apakah ini cara yang benar untuk menggunakan pernyataan python "dengan" dalam kombinasi dengan blok coba-kecuali ?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Jika ya, pertimbangkan cara lama dalam melakukan sesuatu:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Apakah manfaat utama dari pernyataan "dengan" di sini adalah kita dapat menghilangkan tiga baris kode? Tampaknya tidak terlalu memaksa bagi saya untuk kasus penggunaan ini (meskipun saya memahami bahwa pernyataan "dengan" memiliki kegunaan lain).
EDIT: Apakah fungsi dari dua blok kode di atas identik?
EDIT2: Beberapa jawaban pertama berbicara secara umum tentang manfaat menggunakan "dengan", tetapi tampaknya manfaat marjinal di sini. Kita semua telah (atau seharusnya) secara eksplisit memanggil f.close () selama bertahun-tahun. Saya kira satu keuntungan adalah bahwa pembuat kode ceroboh akan mendapatkan keuntungan dari penggunaan "dengan".
Jawaban:
finally
klausa karenaf
tidak terikat.Kode gaya lama yang setara adalah:
Seperti yang Anda lihat,
with
pernyataan tersebut dapat mengurangi kerentanan terhadap kesalahan. Di versi Python yang lebih baru (2.7, 3.1), Anda juga dapat menggabungkan beberapa ekspresi dalam satuwith
pernyataan. Sebagai contoh:Selain itu, saya pribadi menganggap menangkap pengecualian sedini mungkin sebagai kebiasaan buruk. Ini bukan tujuan pengecualian. Jika fungsi IO yang bisa gagal adalah bagian dari operasi yang lebih rumit, dalam banyak kasus IOError harus membatalkan seluruh operasi sehingga ditangani di tingkat luar. Dengan menggunakan
with
pernyataan, Anda dapat menyingkirkan semuatry...finally
pernyataan ini di tingkat dalam.sumber
Jika konten
finally
blok ditentukan oleh properti objek file yang dibuka, mengapa pelaksana objek file tidak menjadi orang yang menulisfinally
blok? Itulah manfaat dariwith
pernyataan tersebut, lebih dari sekadar menghemat tiga baris kode dalam contoh khusus ini.Dan ya, cara Anda menggabungkan
with
dantry-except
merupakan satu-satunya cara untuk melakukannya, karena kesalahan luar biasa yang disebabkan dalamopen
pernyataan itu sendiri tidak dapat ditangkap di dalamwith
blok.sumber
Saya pikir Anda salah tentang pernyataan "dengan" yang hanya mengurangi garis. Ini sebenarnya melakukan inisialisasi dan menangani pembongkaran.
Dalam kasus Anda "dengan" tidak
Berikut ini tautan untuk memahami pernyataan "dengan": http://effbot.org/zone/python-with-statement.htm
Edit: Ya, penggunaan "dengan" Anda benar dan fungsionalitas kedua blok kode itu identik. Pertanyaan tentang mengapa menggunakan "dengan"? itu karena manfaat yang Anda dapatkan dengannya. seperti yang Anda sebutkan tentang f.close () yang hilang secara tidak sengaja.
sumber
Cara yang lebih Pythonic untuk kode-kode berikut adalah:
sumber
readline()
panggilan yang hilang , versi Anda tidak menutup file jikareadline()
hasilnya adalahIOError
.