முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 9 · பாடம் 3 இன் 4பாடத்திட்டத்தில் 35/36~12 min
தொகுதி பாடங்கள் (3/4)

சூழல் மேலாளர்: உடன் மற்றும் __enter__/__exit__

சூழல் மேலாளர் என்பது with உடன் நீங்கள் பயன்படுத்தும் ஒரு பொருளாகும். அது உத்தரவாதம் அளிக்கிறது பிழைகள் ஏற்பட்டாலும் கூட, சில அமைப்பு/துப்புரவு செயல்பாடுகள் எப்போதும் நடக்கும். நியமன உதாரணம்: கோப்பைத் திறந்து மூடுவது.

with பேட்டர்ன்

Python
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 ஒவ்வொரு முறையும்.

ஒரு நேரத்தில் ஒன்றுக்கு மேற்பட்டவை

Python
with open("a.txt") as f, open("b.txt") as g:
    dati_a = f.read()
    dati_b = g.read()

உங்கள் சொந்த சூழல் மேலாளர் (வகுப்பு) எழுதுதல்

நீங்கள் இரண்டு டண்டர் முறைகளை வரையறுக்க வேண்டும்: __enter__ மற்றும் __exit__.

Python
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 ஒரு சூழல் மேலாளராக எழுத உங்களை அனுமதிக்கிறது ஜெனரேட்டர் செயல்பாடு:

Python
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 சுத்தம் செய்ய உத்தரவாதம் அளிக்கிறது.

அடக்கி: விதிவிலக்கை புறக்கணி

Python
from contextlib import suppress

with suppress(FileNotFoundError):
    open("forse-non-esiste.txt").read()
# se il file non c'è, nessun errore propaga

ஆபத்து: with அதை ஆதரிக்கும் பொருட்களுக்கு மட்டுமே

Python
x = 42
with x:  # AttributeError: __enter__
    ...

@contextmanager உடன் சூழல் மேலாளர்களை எழுதுதல்

நிலையான நூலகத்தின் contextlib தொகுதியானது, __enter__ மற்றும் __AGYTOK_IN முறைகளை நடைமுறைப்படுத்தும் சொற்பொழிவு வகுப்புகளை எழுதுவதற்குப் பதிலாக, ஜெனரேட்டர் செயல்பாடுகளைப் பயன்படுத்தி சூழல் மேலாளர்களை உருவாக்க, @contextmanager எனப்படும் மிகவும் வசதியான டெக்கரேட்டரை ஏற்றுமதி செய்கிறது. ஒற்றை yield ஐப் பயன்படுத்தும் ஜெனரேட்டர் செயல்பாட்டை நீங்கள் எழுதுங்கள்:

Python
from contextlib import contextmanager

@contextmanager
def manage_resource():
    # __enter__ code
    yield resource
    # __exit__ code

நீங்களே முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#python.m9.l3.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ValueError ஐப் புறக்கணித்து int('non-numero') முயற்சி செய்ய contextlib.suppress ஐப் பயன்படுத்தவும். தொகுதிக்குப் பிறகு `ok = True` என்பதை ஒதுக்கவும். `சரி` என்பதை மதிப்பிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

அடக்கி (ValueError) மதிப்பு பிழையை மட்டுமே விழுங்குகிறது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#python.m9.l3.e2
முயற்சிகள்: 0ஏற்றுகிறது…

@contextmanager உடன் சூழல் மேலாளர் `சேகரி' எழுதவும், அது வெற்றுப் பட்டியலைத் தருகிறது மற்றும் வெளியேறும் போது, ​​அதை டூபிளாக மாற்றுகிறது (அதை அச்சிடவும்). பிளாக்கிற்குள் உள்ள பட்டியலில் 1, 2, 3ஐச் சேர்க்க இதைப் பயன்படுத்தவும். முடிவில், `லென்(சேகரிப்பு)` என்பதை மதிப்பிடவும், அங்கு `சேகரிப்பு` என்பது விளைந்த பட்டியல்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

தொகுதிக்குள் உள்ள பட்டியலை அம்பலப்படுத்த உருப்படிகள்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

கூடுதல் சவால்

உடற்பயிற்சி#python.m9.l3.e3
முயற்சிகள்: 0ஏற்றுகிறது…

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 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்