Python 3.11 dasturlash tilining chiqarilishi

Bir yillik rivojlanishdan so'ng, Python 3.11 dasturlash tilining muhim versiyasi nashr etildi. Yangi filial bir yarim yil davomida qo'llab-quvvatlanadi, shundan so'ng yana uch yarim yil davomida zaifliklarni bartaraf etish uchun tuzatishlar ishlab chiqariladi.

Shu bilan birga, Python 3.12 filialining alfa-sinovi boshlandi (yangi ishlab chiqish jadvaliga muvofiq, yangi filial bo'yicha ish oldingi filialning chiqarilishidan besh oy oldin boshlanadi va keyingi versiyada alfa-sinov bosqichiga etadi. ). Python 3.12 filiali yetti oy davomida alfa versiyasida bo‘ladi, bu vaqt davomida yangi funksiyalar qo‘shiladi va xatolar tuzatiladi. Shundan so'ng, beta-versiyalar uch oy davomida sinovdan o'tkaziladi, uning davomida yangi funksiyalarni qo'shish taqiqlanadi va barcha e'tibor xatolarni tuzatishga qaratiladi. Chiqarilishdan oldingi so'nggi ikki oy davomida filial nomzodlik bosqichida bo'ladi, bunda yakuniy barqarorlashtirish amalga oshiriladi.

Python 3.11 ga yangi qo'shimchalar quyidagilarni o'z ichiga oladi:

  • Ishlashni optimallashtirish bo'yicha muhim ishlar amalga oshirildi. Yangi filial funksiya chaqiruvlarini tezlashtirish va inline joylashtirish, standart operatsiyalarning tezkor tarjimonlaridan foydalanish (x+x, x*x, xx, a[i], a[i] = z, f(arg) bilan bog'liq o'zgarishlarni o'z ichiga oladi. C( arg), o.method(), o.attr = z, *seq), shuningdek Cinder va HotPy loyihalari tomonidan tayyorlangan optimallashtirishlar. Yukning turiga qarab, kodni bajarish tezligi 10-60% gacha oshadi. Pyperformance test to'plamida ishlash o'rtacha 25% ga oshdi.

    Bayt-kodni keshlash mexanizmi qayta ishlab chiqildi, bu tarjimonni ishga tushirish vaqtini 10-15% ga qisqartirdi. Kod va bayt-kodga ega ob'ektlar endi tarjimon tomonidan statik ravishda ajratiladi, bu keshdan chiqarilgan bayt-kodni ajratish va dinamik xotiraga joylashtiriladigan kod bilan ob'ektlarni aylantirish bosqichlarini bartaraf etishga imkon berdi.

  • Diagnostik xabarlarda qo'ng'iroq izlarini ko'rsatishda endi xatoga sabab bo'lgan ifoda haqidagi ma'lumotni ko'rsatish mumkin (ilgari faqat chiziqning qaysi qismi xatolikka sabab bo'lganligi batafsil ko'rsatilmagan holda ajratilgan). Kengaytirilgan kuzatuv ma'lumotlarini API orqali ham olish mumkin va codeobject.co_positions() usuli yoki C API funksiyasi PyCode_Addr2Location() yordamida manba kodidagi ma'lum bir pozitsiyaga individual bayt-kod ko'rsatmalarini xaritalash uchun ishlatilishi mumkin. Oʻzgartirish ichki oʻrnatilgan lugʻat obyektlari, bir nechta funksiya chaqiruvlari va murakkab arifmetik ifodalar bilan bogʻliq muammolarni tuzatishni ancha osonlashtiradi. Kuzatuv (eng oxirgi qo‘ng‘iroq): "calculation.py" fayli, 54-qator, natijada = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: nolga bo'linish
  • Dasturga bir vaqtning o'zida bir nechta turli istisnolarni yaratish va qayta ishlash imkoniyatini beruvchi istisno guruhlari uchun qo'shimcha yordam. Bir nechta istisnolarni guruhlash va ularni birlashtirish uchun yangi istisno turlari ExceptionGroup va BaseExceptionGroup taklif qilindi va guruhdagi alohida istisnolarni ta'kidlash uchun "istisno*" ifodasi qo'shildi.
  • BaseException sinfiga add_note() usuli qo'shildi, bu sizga istisnoga matnli eslatma qo'shish imkonini beradi, masalan, istisno chiqarilganda mavjud bo'lmagan kontekstual ma'lumotlarni qo'shish.
  • Joriy xususiy sinfni ifodalash uchun maxsus Self turi qo'shildi. Self-dan TypeVar-dan ko'ra oddiyroq tarzda o'z sinfining namunasini qaytaradigan usullarga izoh berish uchun foydalanish mumkin. sinf MyLock: def __enter__(self) -> Self: self.lock() o'zini qaytaradi
  • Faqat LiteralString turiga mos keladigan satr literallarini o'z ichiga olishi mumkin bo'lgan maxsus LiteralString turi qo'shildi (ya'ni, yalang'och va LiteralString satrlari, lekin ixtiyoriy yoki birlashtirilgan str satrlari emas). LiteralString turidan string argumentlarini funksiyalarga o'tkazishni cheklash, qator qismlarini o'zboshimchalik bilan almashtirish zaifliklarga olib kelishi mumkin, masalan, SQL so'rovlari yoki qobiq buyruqlari uchun satrlarni yaratishda foydalanish mumkin. def run_query(sql: LiteralString) -> ... ... def caller(arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM student") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Xato ishga tushirish_so'rovi (# Xato f"SELECT * FROM students WHERE name = {ixtiyoriy_string}" )
  • TypeVarTuple turi qo'shildi, bu o'zgaruvchan generiklardan foydalanish imkonini beruvchi TypeVar dan farqli o'laroq, bir turni emas, balki ixtiyoriy sonli turlarni qamrab oladi.
  • Standart kutubxona TOML formatini tahlil qilish funktsiyalariga ega tomllib modulini o'z ichiga oladi.
  • Majburiy va ixtiyoriy maydonlarni aniqlash uchun terilgan lug'atlarning (TypedDict) alohida elementlarini Required va NotRequired belgilari bilan belgilash mumkin (sukut bo'yicha, agar umumiy parametr False qiymatiga o'rnatilmagan bo'lsa, barcha e'lon qilingan maydonlar talab qilinadi). class Movie(TypedDict): sarlavha: str yil: NotRequired[int] m1: Film = {"nom": "Qora pantera", "yil": 2018} # OK m2: Film = {"nom": "Yulduzli urushlar" } # OK (yil maydoni ixtiyoriy) m3: Film = {“yil”: 2022} # Xato, kerakli sarlavha maydoni toʻldirilmagan)
  • TaskGroup klassi asyncio moduliga bir qator vazifalar bajarilishini kutuvchi asinxron kontekst menejerini amalga oshirish bilan qo'shildi. Guruhga vazifalar qo'shish create_task() usuli yordamida amalga oshiriladi. async def main(): asyncio.TaskGroup() bilan tg sifatida async: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(boshqa_coro(...)) print("Har ikkala vazifa ham bajarildi. .")
  • Sinflar, usullar va funksiyalar uchun @dataclass_transform dekoratori qoʻshildi, agar belgilangan boʻlsa, statik tipni tekshirish tizimi obʼyektga @dataclass.dataclass dekoratoridan foydalangandek munosabatda boʻladi. Quyidagi misolda, CustomerModel klassi, turlarni tekshirishda, @dataclasses.dataclass dekoratori bo'lgan sinfga o'xshash tarzda qayta ishlanadi, ya'ni. id va nom o'zgaruvchilarni qabul qiladigan __init__ usuliga ega bo'lish. @dataclass_transform() sinf ModelBase: ... sinf CustomerModel(ModelBase): id: int nomi: str
  • Muntazam iboralarda atomik guruhlash ((?>...)) va egalik kvantlovchilaridan (*+, ++, ?+, {m,n}+) foydalanish imkoniyati qo‘shilgan.
  • Potensial xavfli fayl yoʻllarini sys.pathga avtomatik biriktirishni oʻchirish uchun “-P” buyruq qatori opsiyasi va PYTHONSAFEPATH muhit oʻzgaruvchisi qoʻshildi.
  • Windows platformasi uchun py.exe yordam dasturi "-V:" sintaksisini qo'llab-quvvatlagan holda sezilarli darajada yaxshilandi. / " ga qo'shimcha sifatida "- . "
  • C API-dagi ko'plab makroslar oddiy yoki statik inline funktsiyalarga aylantiriladi.
  • uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev va sunau modullari eskirgan va Pythonda olib tashlanadi. 3.13 nashri. PyUnicode_Encode* funksiyalari olib tashlandi.

Manba: opennet.ru

a Izoh qo'shish