Aslında tam olarak nereyi anlamadığımı kodlar üzerinde göstersem sorum daha iyi anlaşılacak olduğunu düşünüyorum. Öncelikle şunu belirtmeliyim bu konununorjinali şu linktir. https://www.python.org/dev/peps/pep-0492/#example. İlgilenen ve destek olan arkadaşlarıma şimdiden teşekkür ederim.
#Asenkron Context Manager Fonksiyonu aşağıdaki gibi ve buradaki aenter ve aexit metodları bir korotin olduğu için awaitable nesne döndürüyor ve bu iki metod başka metodları çalıştırırken önce askıya alıp kontrol ediyor eğer metod da sorun yoksa giriş (yani programı çalıştırıyor) eğer verdiğimiz metod sorunluysa programdan çıkış yapıyor.Bir anlamda if else gibi hatta try except desem daha iyi gibi ama asenkron biçimde.
class AsyncContextManager:
async def __aenter__(self):
await log('entering context')
async def __aexit__(self, exc_type, exc, tb):
await log('exiting context')
#şimdi async with ile bir örnek kod yazalım.
async with EXPR as VAR:
BLOCK
bu async with deyimli kodu python şöyle okuyor ve anlamlandıramadığım kısımda burası.
mgr = (EXPR)#burası bizim metodumuzun tuple içine alarak değişkene atanan kısmı
aexit = type(mgr).__aexit__#burada asenkron context manager metodu olan __aexit__ kullandık ama nasıl, __aexit__ metodunu nasıl kullanabildik.
aenter = type(mgr).__aenter__(mgr) #aynı şekilde __aenter__ metodunu nasıl kullanabildik.
VAR = await aenter #aşağıdaki BLOCK asenkron çalışıp awaitable bir nesne döndürmesini sağlıyor.
try:
BLOCK#kod bloğunu çalıştır
except:
if not await aexit(mgr, *sys.exc_info()):#yukarıdaki __aexit__ metoduyla bir courotin yarattık sanırım burada da eğer oluşmadıysa hataya çıkıyoruz.
raise
else:#aksi bir durum varsa __aexit__ metoduyla oluşturduğumuz aexit courotini ile askıdaki programımızı(o an çalışan metodu )dan çıkıp onu hata ile sonlandırıyoruz.
await aexit(mgr, None, None, None)
yukarıdaki kodların yanında yaptığım açıklamalarda anlamadığım yerleri paylaşmaya çalıştım, acaba bana yardımcı olabilir misiniz?Açıklamalar benim anladığım, doğrusu nedir acaba?