Perhatikan contoh berikut:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
Saya telah membaca dokumen bahasa (2.7) untuk with-statement serta PEP-343, tetapi sejauh yang saya tahu mereka tidak mengatakan apa-apa tentang masalah ini.
Dalam CPython 2.6.5 f
tampaknya didefinisikan di luar blok with, tetapi saya lebih suka tidak bergantung pada detail implementasi yang dapat berubah.
Jawaban:
Ya, manajer konteks akan tersedia di luar pernyataan with dan itu tidak tergantung pada implementasi atau versi. dengan pernyataan tidak membuat ruang lingkup eksekusi baru.
sumber
yang
with
sintaks:with foo as bar: baz()
kira-kira gula untuk:
try: bar = foo.__enter__() baz() finally: if foo.__exit__(*sys.exc_info()) and sys.exc_info(): raise
Ini seringkali berguna. Sebagai contoh
import threading with threading.Lock() as myLock: frob() with myLock: frob_some_more()
manajer konteks mungkin berguna lebih dari sekali.
sumber
Dalam kasus
f
file, itu akan muncul ditutup di luarwith
pernyataan.Misalnya, ini
f = 42 print f with open('6432134.py') as f: print f print f
akan mencetak:
42 <open file '6432134.py', mode 'r' at 0x10050fb70> <closed file '6432134.py', mode 'r' at 0x10050fb70>
Anda dapat menemukan detailnya di PEP-0343 di bawah bagian Spesifikasi: Pernyataan 'dengan' . Aturan lingkup Python (yang mungkin menjengkelkan ) berlaku
f
juga.sumber
[x for x in [1]]
.x
tersedia di luar itu. Membuatnya menjadi generator:(x for x in [1])
. Sekarangx
tidak tersedia. Sepertinya saya ingat ini diubah dalam Python 3 sehingga bahkan dengan pemahaman daftarx
tidak akan bocor, tetapi saya tidak dapat menemukan referensi sekarang.Untuk menjawab pertanyaan Heikki di komentar: ya, perilaku pelingkupan ini adalah bagian dari spesifikasi bahasa python dan akan berfungsi pada semua dan semua Pythons yang sesuai (yang mencakup PyPy, Jython, dan IronPython).
sumber