پس از یک سال توسعه، نسخه قابل توجه زبان برنامه نویسی Python 3.11 منتشر شد. شعبه جدید به مدت یک سال و نیم پشتیبانی می شود و پس از آن برای سه سال و نیم دیگر، اصلاحاتی برای رفع آسیب پذیری ها برای آن ایجاد می شود.
همزمان، تست آلفای شاخه پایتون 3.12 آغاز شد (طبق برنامه توسعه جدید، کار بر روی شاخه جدید پنج ماه قبل از انتشار شاخه قبلی شروع می شود و تا زمان انتشار بعدی به مرحله تست آلفا می رسد. ). شعبه Python 3.12 به مدت هفت ماه در نسخه آلفا منتشر خواهد شد و در طی آن ویژگی های جدید اضافه شده و باگ ها برطرف خواهند شد. پس از این، نسخههای بتا به مدت سه ماه تست میشوند و در این مدت افزودن ویژگیهای جدید ممنوع و تمام توجه به رفع باگها معطوف خواهد شد. در دو ماه آخر قبل از انتشار، شعبه در مرحله کاندید آزادی خواهد بود که در آن تثبیت نهایی انجام خواهد شد.
موارد اضافه شده جدید به Python 3.11 عبارتند از:
- کار قابل توجهی برای بهینه سازی عملکرد انجام شده است. شاخه جدید شامل تغییرات مربوط به شتاب و استقرار درون خطی فراخوانی توابع، استفاده از مفسرهای سریع عملیات استاندارد (x+x، x*x، xx، a[i]، a[i] = z، f(arg) است. C(arg)، o.method()، o.attr = z، *seq)، و همچنین بهینه سازی های تهیه شده توسط پروژه های Cinder و HotPy. بسته به نوع بار، سرعت اجرای کد 10-60 درصد افزایش می یابد. به طور متوسط، عملکرد مجموعه تست pyperformance 25٪ افزایش یافته است.
مکانیسم ذخیره بایت کد مجدداً طراحی شده است که زمان راه اندازی مفسر را 10-15٪ کاهش داده است. اکنون اشیاء دارای کد و بایت کد به صورت ایستا توسط مفسر تخصیص داده می شوند، که این امکان حذف مراحل حذف بایت کد استخراج شده از حافظه پنهان و تبدیل اشیاء با کد برای قرار دادن در حافظه پویا را فراهم می کند.
- هنگام نمایش ردیابی تماس در پیامهای تشخیصی، اکنون میتوان اطلاعات مربوط به عبارتی را که باعث خطا شده است نمایش داد (قبلاً فقط خط برجسته میشد بدون اینکه جزئیات مربوط به کدام قسمت از خط باعث خطا شده است). اطلاعات ردیابی توسعه یافته را نیز می توان از طریق API به دست آورد و برای نگاشت دستورالعمل های بایت کد منفرد به یک موقعیت خاص در کد منبع با استفاده از روش codeobject.co_positions() یا تابع C API PyCode_Addr2Location() استفاده کرد. این تغییر اشکال زدایی مسائل مربوط به اشیاء دیکشنری تودرتو، فراخوانی چند تابع و عبارات پیچیده حسابی را بسیار آسانتر میکند. ردیابی (آخرین تماس اخیر): فایل "calculation.py"، خط 54، در نتیجه = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: تقسیم بر صفر
- پشتیبانی از گروه های استثنا اضافه شده است که به برنامه توانایی تولید و پردازش چندین استثنا مختلف را در یک زمان می دهد. برای گروهبندی چندین استثنا و بالا بردن آنها با هم، انواع استثناهای جدید ExceptionGroup و BaseExceptionGroup پیشنهاد شدهاند، و عبارت «except*» برای برجسته کردن استثناهای یک گروه اضافه شده است.
- متد ()add_note به کلاس BaseException اضافه شده است که به شما امکان می دهد یک یادداشت متنی را به استثنا پیوست کنید، برای مثال، اطلاعات متنی را اضافه کنید که در هنگام پرتاب استثنا در دسترس نیست.
- یک نوع Self ویژه برای نمایش کلاس خصوصی فعلی اضافه شده است. Self را می توان برای حاشیه نویسی روش هایی استفاده کرد که نمونه ای از کلاس خود را به روشی ساده تر از استفاده از TypeVar برمی گرداند. class MyLock: def __enter__(self) -> Self: self.lock() return self
- یک نوع LiteralString ویژه اضافه شد که فقط میتواند شامل کلمات رشتهای باشد که با نوع LiteralString سازگار هستند (یعنی رشتههای خالی و LiteralString، اما نه رشتههای دلخواه یا ترکیبی). نوع LiteralString میتواند برای محدود کردن ارسال آرگومانهای رشتهای به توابع، جایگزینی دلخواه بخشهایی از رشتهها که در آن میتواند منجر به آسیبپذیری شود، به عنوان مثال، هنگام تولید رشتهها برای کوئریهای SQL یا دستورات پوسته استفاده میشود. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM Students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # خطا run_query( # Error f"SELECT * FROM Students WHERE name = {arbitrary_string}" )
- نوع TypeVarTuple اضافه شده است که امکان استفاده از ژنریک متغیرها را فراهم می کند، برخلاف TypeVar که نه یک نوع، بلکه تعداد دلخواه از انواع را پوشش می دهد.
- کتابخانه استاندارد شامل ماژول tomllib با توابعی برای تجزیه قالب TOML است.
- برای تعیین فیلدهای الزامی و اختیاری، میتوان عناصر تکی دیکشنریهای تایپشده (TypedDict) را با برچسبهای Required و NotRequired علامتگذاری کرد (بهطور پیشفرض، اگر پارامتر کل روی False تنظیم نشده باشد، همه فیلدهای اعلامشده مورد نیاز هستند). class Movie(TypedDict): عنوان: str year: NotRequired[int] m1: Movie = {"title": "Black Panther"، "year": 2018} # OK m2: Movie = {"عنوان": "جنگ ستارگان" } # OK (فیلد سال اختیاری است) m3: Movie = {“year”: 2022} # خطا، قسمت عنوان مورد نیاز پر نشده است)
- کلاس TaskGroup با پیاده سازی یک مدیر زمینه ناهمزمان که منتظر تکمیل گروهی از وظایف است به ماژول asyncio اضافه شده است. افزودن وظایف به یک گروه با استفاده از متد ()create_task انجام می شود. async def main(): async با asyncio.TaskGroup() به عنوان tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("هر دو کار اکنون تکمیل شده اند ")
- دکوراتور @dataclass_transform برای کلاسها، روشها و توابع اضافه شد، در صورت مشخص شدن، سیستم بررسی نوع استاتیک با شی بهگونهای رفتار میکند که گویی از دکوراتور @dataclasses.dataclass استفاده میکند. در مثال زیر، کلاس CustomerModel، هنگام بررسی انواع، مشابه کلاسی با دکوراتور @dataclasses.dataclass پردازش میشود. به عنوان داشتن یک متد __init__ که متغیرهای id و name را می پذیرد. @dataclass_transform کلاس ModelBase: … کلاس CustomerModel(ModelBase): شناسه: نام int: str
- در عبارات منظم، قابلیت استفاده از گروه بندی اتمی ((?>...)) و کمیت کننده های مالکیتی (*+، ++، ?+، {m,n}+) اضافه شده است.
- گزینه خط فرمان "-P" و متغیر محیطی PYTHONSAFEPATH برای غیرفعال کردن پیوست خودکار مسیرهای فایل بالقوه ناامن به sys.path اضافه شد.
- ابزار py.exe برای پلتفرم ویندوز به طور قابل توجهی بهبود یافته است و پشتیبانی از نحو "-V:" را اضافه کرده است. / " بعلاوه "- . "
- بسیاری از ماکروها در C API به توابع درون خطی منظم یا ثابت تبدیل می شوند.
- ماژولهای uu، cgi، pipes، crypt، aifc، chunk، msilib، telnetlib، audioop، nis، sndhdr، imghdr، nntplib، spwd، xdrlib، cgitb، mailcap، ossaudiodev و sunau منسوخ شدهاند و در قسمت حذف خواهند شد. 3.13 انتشار. توابع PyUnicode_Encode* حذف شد.
منبع: opennet.ru