Rumah > Artikel > pembangunan bahagian belakang > Menyahmistikan kata kunci dengan dalam Python
Ramai di antara kita telah melihat coretan kod ini berulang kali dalam kod Python:
with open('Hi.text', 'w') as f: f.write("Hello, there")
Namun, sesetengah daripada kita tidak tahu dengan Apa itu digunakan untuk, dan mengapa kita perlu menggunakannya di sini. Dalam bacaan ini, anda akan mengetahui hampir semua masalah yang boleh diselesaikan. Mari mulakan!
Pertama, mari kita fikirkan tentang perkara yang perlu kita lakukan tanpa menggunakan kata kunci dengan. Dalam kes ini kita perlu membuka fail terlebih dahulu dan cuba menulis. Tidak kira kejayaan atau kegagalan, lebih baik kita menutupnya pada penghujungnya, jadi kod kita akan kelihatan seperti ini:
f = open('Hi.text', 'w') try: f.write('Hello, there') finally: f.close()
Jadi, apakah kegunaan kata kunci dengan? Ia hanya membantu memendekkan percubaan kami..akhirnya kod kepada satu dengan... kenyataan! Beginilah cara pernyataan with digunakan.
Jadi, apa sebenarnya? Sebenarnya, pernyataan with itu sendiri bukanlah sesuatu yang istimewa dalam Python, ia hanyalah ciri pengurus konteks dalam Python. Pengurus konteks, yang dipetik daripada dokumentasi Python rasmi, ialah satu cara untuk membolehkan anda memperuntukkan dan membebaskan sumber tepat apabila diperlukan, atau secara ringkas: memendekkan coretan kod anda apabila anda melakukan sesuatu pada beberapa sumber, yang bermaksud Kemudian anda boleh menentukan penggunaan daripada dengan kenyataan sendiri!
Bagaimana kita melakukan ini? Nah, ia mudah, anda hanya perlu melaksanakan dua fungsi ajaib: satu dipanggil __enter__ dan satu lagi dipanggil __exit__. Cara pertama ialah menulis kelas yang melaksanakan dua fungsi ini seperti ini:
class My_file: def __init__(self, fname): self.fname = fname def __enter__(self): self.file = open(self.fname, 'w') return self.file def __exit__(self, exc_type, exc_val, exc_trace_back): if self.file: self.file.close()
Di sini, kami telah mencipta kelas Python biasa yang melaksanakan dua fungsi ajaib. Perhatikan tandatangan kedua-dua fungsi ini: __enter__ hanya akan menerima self , manakala __exit__ akan menerima lebih banyak hujah, tiga dalam contoh adalah bentuk standard. Dengan cara ini, kita boleh menggunakannya secara langsung:
with My_file('hello.txt') as f: f.write('hello, world!')
Pernyataan with di sini akan memanggil __init__ untuk membina objek baharu, dan kemudian memanggil kaedah __enter__ akhirnya, ia akan mencetuskan __exit__ sebelum blok kod kaedah selesai. Jadi, persamaan kasar kod di atas adalah seperti berikut:
myfile = My_file('hello.txt') f = myfile.__enter__() f.write('hello, world!') myfile.__exit(...)
Cara kedua untuk melaksanakan pengurus konteks adalah melalui penghias, seperti berikut:
Mengikut pengenalan di atas, mari kita tulis pengurus konteks penghias!
from contextlib import contextmanager @contextmanager def my_file_open(fname): try: f = open(fname, 'w') yield f finally: print('Closing file') f.close() with file_open('hi.txt') as f: f.write('hello world')
Perkara di atas merangkumi semua asas dengan pernyataan dan pengurus konteks, tetapi jika anda ingin mengetahui lebih lanjut, teruskan...!
Terdapat beberapa alatan berguna dalam contextlib untuk anda gunakan. Yang pertama tutup. penutupan pada dasarnya membungkus blok kod anda dengan fungsi lain yang anda laksanakan sebelum keluar.
@contextmanager def closing(f): try: f.write("Finish writing") finally: f.close() with closing(open("hi.text")): f.write("hello world")
Sebagai contoh, dalam kod di atas, kami boleh terus memanggil close(your_way_of_getting_resource), sejurus sebelum blok kod yang anda tulis di bawah hampir selesai (f.write("hello world")), ia akan Melaksanakan percubaan..akhirnya sekat yang kami takrifkan di atas.
Yang lain ialah menggunakan alat penindas. Kami tahu bahawa dalam banyak kes, jika kami cuba mendapatkan beberapa sumber, kemungkinan ralat seperti FileNotFoundException akan berlaku semasa membuka fail. Dalam sesetengah kes, kami ingin menangkap ralat atau menyekatnya supaya atur cara boleh terus berjalan seperti biasa. menekan adalah salah satu cara kita boleh menyekat amaran. Apa yang anda perlu lakukan ialah memikirkan pengecualian yang anda ingin sekat dan tulis dengan suppress(your_choice_of_exception) dan Python akan mengendalikannya dari sana.
Dalam kes lain, anda mungkin hanya mahu melakukan tindakan tertentu apabila memasuki dengan blok. Dalam kes ini, nullcontext akan memudahkan anda. nullcontext hanya akan mengembalikan apa yang anda takrifkan dalam fungsi __enter__ dan tidak akan melakukan apa-apa lagi. Jika anda berurusan dengan operasi async dalam Python untuk mengakses sumber, penutupan ialah utiliti untuk mengendalikan situasi ini.
Artikel ini memperkenalkan beberapa konsep asas dan penggunaan pernyataan dengan dan prinsip kerja asasnya. Terdapat banyak lagi perkara yang menarik, lihat dokumentasi contextlib Python. Akhir sekali, saya mengucapkan selamat belajar dan selamat mengekod seperti biasa!
Atas ialah kandungan terperinci Menyahmistikan kata kunci dengan dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!