PEP-0765: finally ichidagi return
Quyidagi holat tanishmi?
>>> def bool_return() -> bool:
... try:
... return True
... finally:
... return False
...
>>> bool_return()
False # 🙂↔️
Python bo'yicha texnik intervyularda so'raladi, "
bu False qaytaradi" degan javob kutiladi. Ammo, True desangiz "
finally qanday ishlashini bilmas ekansiz" deyiladi.
Dokumentatsiya bo'yicha qaralganda,
exception handlingda finally har qanday holatda eng oxirgi bo'lib bajariladigan blok sanaladi. Shu sababli, undagi return yuqori ustunlikka ega (oxirgi bo'lgani uchun):
The return value of a function is determined by the last return statement executed. Since the finally clause always executes, a return statement executed in the finally clause will always be the last one executed. [1]
Bu holatni qabul qilish men uchun qiyin bo'lgan. Funksiyani chaqiramiz, chaqirilgan funksiya(routine) return orqali o'z vazifasini yakunlaydi, va "return adres" tomon sakraydi(qaytadi) ya'ni avval chaqirilgan joyiga
[2]. Fundamental tushuncha, shunday emasmi !? Nega 1-returnning e'tiborsiz qoldirilayotgani g'alati va yoqimsiz. Dokumentatsiyada yozilgani, yoki kimdir aytgani uchun buni shundayligicha qabul qilishimiz kerakmi ... ?
finally bloki "cleanup"(tozalash) ishlarida foydalaniladi deb ta'kidlangan, va sog'lom intelekt uni shu uchun ishlatadi. Yuqoridagiga o'xshash kodlar sababli tushunarsiz xatoliklar keltirib chiqaradi.
Keyinroq bildimki, bu pythondagi nozik mavzulardan biri ekan )
Eng oson yechim, dasturchiga buni yozgani qo'ymaslik & o'rgatish. Linterlar tomonidan bunga qarshi choralar ko'rilgan
[3][4][5], interpretator tomonidan esa yo'q. Avvalgi urinishlar rad etilgan
[6]. Yaqin o'tmishda bu mavzu qayta ko'tarildi (PEP-0765), va ushbu "xatolik" hal qilindi (deyarli).
Men shunchaki returnga oid holatni ozgina yoritdim, aslida break/continue bilan bog'liq drama ham bor va ular bilan PEP orqali tanishib chiqishingiz mumkin.
Yangi interpretator (3.14dan boshlab), ushbu holat uchun SyntaxWarning generatsiya qila boshlaydi (ogohlantirish, ya'ni kodni to'xtamaydi, sizni xabardor qiladi). Keyingi relizlarda SyntaxError chaqirilishi ta'kidlanmoqda.
Ko'proq• PEP:
https://peps.python.org/pep-0765• Izlanish:
https://github.com/iritkatriel/finally• Discussion
: https://discuss.python.org/t/pep-765-disallow-return-break-continue-that-exit-a-finally-block@AbduazizPy