Apakah mungkin untuk mendeklarasikan lebih dari satu variabel menggunakan with
pernyataan dengan Python?
Sesuatu seperti:
from __future__ import with_statement
with open("out.txt","wt"), open("in.txt") as file_out, file_in:
for line in file_in:
file_out.write(line)
... atau apakah membersihkan dua sumber daya sekaligus masalah?
python
with-statement
ikan buntal
sumber
sumber
Jawaban:
Dimungkinkan dalam Python 3 sejak v3.1 dan Python 2.7 .
with
Sintaks baru mendukung beberapa manajer konteks:Berbeda dengan
contextlib.nested
, ini menjamin itua
danb
akan memiliki panggilan mereka__exit__()
bahkan jikaC()
atau__enter__()
metode itu menimbulkan pengecualian.Anda juga dapat menggunakan variabel sebelumnya dalam definisi selanjutnya (h / t Ahmad di bawah):
sumber
with open('./file') as arg.x = file:
?as
bersifat opsional.as
diperlukan jika Anda memerlukan objeka
ataub
, tetapi keseluruhanas a
atauas b
tidak diperlukancontextlib.nested
mendukung ini:Pembaruan:
Mengutip dokumentasi, mengenai
contextlib.nested
:Lihat jawaban Rafał Dowgird untuk informasi lebih lanjut.
sumber
nested
manajer konteks adalah kesalahan dan tidak boleh digunakan. Dalam contoh ini, jika membuka file kedua menimbulkan pengecualian, file pertama tidak akan ditutup sama sekali, sehingga benar-benar menghancurkan tujuan menggunakan manajer konteks.with
blok bersarang standar . Manajer dibuat secara berurutan sebelum memasukkan dengan: m1, m2, m3 = A (), B (), C () Jika B () atau C () gagal dengan pengecualian, maka satu-satunya harapan Anda untuk menyelesaikan A dengan benar ( ) adalah pemulung.Perhatikan bahwa jika Anda membagi variabel menjadi beberapa baris, Anda harus menggunakan garis miring terbalik untuk membungkus baris baru.
Kurung tidak berfungsi, karena Python malah membuat tuple.
Karena tupel tidak memiliki
__enter__
atribut, Anda mendapatkan kesalahan (tidak deskriptif dan tidak mengidentifikasi tipe kelas):Jika Anda mencoba menggunakan
as
dalam tanda kurung, Python menangkap kesalahan pada saat parse:https://bugs.python.org/issue12782 tampaknya terkait dengan masalah ini.
sumber
Saya pikir Anda ingin melakukan ini sebagai gantinya:
sumber
Sejak Python 3.3, Anda dapat menggunakan kelas
ExitStack
daricontextlib
modul.Itu dapat mengelola sejumlah objek sadar konteks yang dinamis , yang berarti bahwa itu akan terbukti sangat berguna jika Anda tidak tahu berapa banyak file yang akan Anda tangani.
Kasus penggunaan kanonik yang disebutkan dalam dokumentasi adalah mengelola sejumlah file dinamis.
Ini adalah contoh umum:
Keluaran:
sumber
Dalam Python 3.1+ Anda dapat menentukan beberapa ekspresi konteks, dan mereka akan diproses seolah-olah banyak
with
pernyataan bersarang:setara dengan
Ini juga berarti Anda dapat menggunakan alias dari ekspresi pertama di kedua (berguna ketika bekerja dengan koneksi db / kursor):
sumber