Мазмунга өтүү

Сабактын башталышы

Python'догу контекст менеджерлери

Даярдоо ар дайым бошотуу менен коштолорун кепилдеңиз, бир нерсе туура эмес кеткенде да

Негизги идея: контекст менеджери — бул код блогуна киргенде жана андан чыкканда эмне болушу керектигин аныктаган каалаган объект. Муну with оператору башкарат: __enter__ кирүүдө иштейт, ал эми __exit__ чыгууда кепилденген түрдө иштейт — блок кадимкидей аяктадыбы, return кездештирдиби же өзгөчө кырдаал (exception) жаратабы, баары бир. Бул тилдин "ресурсту кармоо, аны колдонуу жана сөзсүз бошотуу" маселесине жообу.
Аягында сиз төмөнкүлөрдү жасай аласыз:
  • with кантип __enter__/__exit__ протоколуна чагылдырыларын түшүндүрүү,
  • класска негизделген ишенимдүү контекст менеджерин жазуу, анын ичинде __exit__ ичинде өзгөчө кырдаалдарды туура иштетүү,
  • аны @contextlib.contextmanager жана генератор менен алда канча арзаныраак түзүү,
  • __exit__ кайтарган маани жөнүндө жана ал качан өзгөчө кырдаалдарды жутуп коёору жөнүндө ой жүгүртүү,
  • contextlib.ExitStack аркылуу бир нече менеджерди динамикалык түрдө бириктирүү,
  • шаблондук коддун ордуна suppress, closing жана nullcontext колдонуу.

1. Маселе: өткөрүп жиберүүгө болбогон тазалоо

Дээрлик ар бир олуттуу программа кийин бошотулушу керек болгон ресурстарды кармайт: ачык файлдар, тармак сокеттери, маалымат базасынын байланыштары, агым кулпулары (locks), убактылуу каталогдор. Ашыкча жөнөкөй версия бир нерсе өзгөчө кырдаал жаратаары менен агып кетет (leak):

f = open("data.txt")
process(f.read())   # эгер бул жерде өзгөчө кырдаал болсо, кийинки сап иштебейт
f.close()           # АГЫП КЕТҮҮ: файл эч качан жабылбайт

Тарыхый жактан туура чечим — try/finally: finally блогу try блогу кантип аяктаганына карабай иштейт.

f = open("data.txt")
try:
    process(f.read())
finally:
    f.close()        # ДАЙЫМА иштейт, өзгөчө кырдаалда да

Бул иштейт, бирок узун, оңой унутулат, ал эми блок чоңойгон сайын кармоо менен бошотуу бири-биринен алыстайт. Контекст менеджери так ушул try/finally тартибин кайра колдонула турган объектке таңгактайт, ошондо чакырган код бир таза сап жазат.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө