தொகுதி பாடங்கள் (3/4)
சூழல் மேலாளர்: உடன் மற்றும் __enter__/__exit__
சூழல் மேலாளர் என்பது with உடன் நீங்கள் பயன்படுத்தும் ஒரு பொருளாகும். அது உத்தரவாதம் அளிக்கிறது
பிழைகள் ஏற்பட்டாலும் கூட, சில அமைப்பு/துப்புரவு செயல்பாடுகள் எப்போதும் நடக்கும்.
நியமன உதாரணம்: கோப்பைத் திறந்து மூடுவது.
with பேட்டர்ன்
with open("note.txt", "w") as f:
f.write("ciao")
# qui f è già chiuso, anche se write() ha sollevato un'eccezioneஎளிய ஆங்கிலத்தில்: "with resource Xஐ f ஆகத் திறக்கவும், இதைச் செய்யுங்கள். முடிந்ததும்
(என்ன நடந்தாலும்), எக்ஸ் மூடு." with இல்லாமல் நீங்கள் எழுத வேண்டும்
ஒரு try/finally ஒவ்வொரு முறையும்.
ஒரு நேரத்தில் ஒன்றுக்கு மேற்பட்டவை
with open("a.txt") as f, open("b.txt") as g:
dati_a = f.read()
dati_b = g.read()உங்கள் சொந்த சூழல் மேலாளர் (வகுப்பு) எழுதுதல்
நீங்கள் இரண்டு டண்டர் முறைகளை வரையறுக்க வேண்டும்: __enter__ மற்றும் __exit__.
class Timer:
def __enter__(self):
import time
self.t0 = time.perf_counter()
return self # è l'oggetto che finisce dopo "as"
def __exit__(self, exc_type, exc_value, traceback):
import time
self.elapsed = time.perf_counter() - self.t0
# ritornare True ingoia l'eccezione; di solito non lo vuoi
return False
with Timer() as t:
sum(range(10**6))
t.elapsed # quanto è durato__enter__(self)தொகுதிக்குள் நுழையும் போது அழைக்கப்படுகிறது; திரும்பிய மதிப்புasக்குப் பிறகு கிடைக்கும்.__exit__(self, exc_type, exc_value, tb)வெளியேறும் போது அழைக்கப்படுகிறது (எப்போதும்). அதுTrueஎன திரும்பினால், விதிவிலக்குகள் அடக்கப்படும்.
குறுக்குவழி: @contextmanager
contextlib.contextmanager ஒரு சூழல் மேலாளராக எழுத உங்களை அனுமதிக்கிறது
ஜெனரேட்டர் செயல்பாடு:
from contextlib import contextmanager
@contextmanager
def timer():
import time
t0 = time.perf_counter()
try:
yield # qui sta il blocco "with"
finally:
elapsed = time.perf_counter() - t0
print(f"durata: {elapsed:.4f}s")
with timer():
sum(range(10**6))முன் yield குறியீடு __enter__, பின் குறியீடு __exit__.
பிழைகள் ஏற்பட்டாலும் try/finally சுத்தம் செய்ய உத்தரவாதம் அளிக்கிறது.
அடக்கி: விதிவிலக்கை புறக்கணி
from contextlib import suppress
with suppress(FileNotFoundError):
open("forse-non-esiste.txt").read()
# se il file non c'è, nessun errore propagaஆபத்து: with அதை ஆதரிக்கும் பொருட்களுக்கு மட்டுமே
x = 42
with x: # AttributeError: __enter__
...@contextmanager உடன் சூழல் மேலாளர்களை எழுதுதல்
நிலையான நூலகத்தின் contextlib தொகுதியானது, __enter__ மற்றும் __AGYTOK_IN முறைகளை நடைமுறைப்படுத்தும் சொற்பொழிவு வகுப்புகளை எழுதுவதற்குப் பதிலாக, ஜெனரேட்டர் செயல்பாடுகளைப் பயன்படுத்தி சூழல் மேலாளர்களை உருவாக்க, @contextmanager எனப்படும் மிகவும் வசதியான டெக்கரேட்டரை ஏற்றுமதி செய்கிறது. ஒற்றை yield ஐப் பயன்படுத்தும் ஜெனரேட்டர் செயல்பாட்டை நீங்கள் எழுதுங்கள்:
from contextlib import contextmanager
@contextmanager
def manage_resource():
# __enter__ code
yield resource
# __exit__ codeநீங்களே முயற்சி செய்து பாருங்கள்
ValueError ஐப் புறக்கணித்து int('non-numero') முயற்சி செய்ய contextlib.suppress ஐப் பயன்படுத்தவும். தொகுதிக்குப் பிறகு `ok = True` என்பதை ஒதுக்கவும். `சரி` என்பதை மதிப்பிடவும்.
குறிப்பைக் காட்டு
அடக்கி (ValueError) மதிப்பு பிழையை மட்டுமே விழுங்குகிறது.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
மதிப்பாய்வு பயிற்சி
@contextmanager உடன் சூழல் மேலாளர் `சேகரி' எழுதவும், அது வெற்றுப் பட்டியலைத் தருகிறது மற்றும் வெளியேறும் போது, அதை டூபிளாக மாற்றுகிறது (அதை அச்சிடவும்). பிளாக்கிற்குள் உள்ள பட்டியலில் 1, 2, 3ஐச் சேர்க்க இதைப் பயன்படுத்தவும். முடிவில், `லென்(சேகரிப்பு)` என்பதை மதிப்பிடவும், அங்கு `சேகரிப்பு` என்பது விளைந்த பட்டியல்.
குறிப்பைக் காட்டு
தொகுதிக்குள் உள்ள பட்டியலை அம்பலப்படுத்த உருப்படிகள்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
கூடுதல் சவால்
Write a custom context manager using the `@contextmanager` decorator from `contextlib`. The context manager must be named `mock_session`. Upon entry, it must append `'start'` to a global list `log_list = []`, yield control using `yield`, and upon exit append `'stop'`. Finally, evaluate `log_list` after using the context manager with `with mock_session():`.
குறிப்பைக் காட்டு
'நிறுத்து' சேர்ப்பதற்கு முன் செயல்படுத்தலை இடைநிறுத்த, mock_session உள்ளே விளைச்சலைப் பயன்படுத்தவும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்