تازه‌های پایتون 3.11

ویرایشگر:

Pablo Galindo Salgado

این مقاله ویژگی‌های جدید پایتون 3.11 را در مقایسه با 3.10 توضیح می‌دهد. پایتون 3.11 در تاریخ ۲۴ اکتبر ۲۰۲۲ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید.

خلاصه -- نکات برجسته‌ی انتشار

  • پایتون 3.11 بین ۱۰ تا ۶۰ درصد سریع‌تر از پایتون 3.10 است. به‌طور میانگین، افزایش سرعت ۱٫۲۵ برابری را در بدنه بنچمارک‌های استاندارد اندازه‌گیری کردیم. برای جزئیات به سی‌پایتون سریع‌تر (Faster CPython) مراجعه کنید.

ویژگی‌های نحوی جدید:

قابلیت‌های توکار جدید:

ماژول‌های جدید کتابخانه استاندارد:

  • PEP 680: tomllib — پشتیبانی از تجزیه‌ی TOML در کتابخانه استاندارد

بهبودهای مفسر:

قابلیت‌های جدید نوع‌دهی:

منسوخ‌سازی‌ها، حذف‌ها و محدودیت‌های مهم:

ویژگی‌های جدید

PEP 657: مکان‌های ریزدانه‌ی خطا در ردگیری‌ها

هنگام چاپ ردگیری‌ها، مفسر از این پس به عبارت دقیقی که باعث خطا شده است اشاره خواهد کرد، نه فقط به سطر. برای مثال:

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

نسخه‌های قبلی مفسر فقط به سطر اشاره می‌کردند، که باعث می‌شد مبهم باشد کدام شیء None بوده است. این خطاهای بهبودیافته هنگام کار با اشیای dict به‌شدت تودرتو و فراخوانی‌های متعدد تابع نیز می‌توانند مفید باشند:

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

همچنین عبارت‌های حسابی پیچیده:

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero

علاوه بر این، اطلاعات مورد استفاده در قابلیت ردگیری بهبودیافته از طریق یک API عمومی در دسترس قرار گرفته است که می‌توان از آن برای برقراری تناظر میان دستورالعمل‌های bytecode و مکان کد منبع استفاده کرد. این اطلاعات را می‌توان با استفاده از موارد زیر بازیابی کرد:

برای جزئیات بیشتر به PEP 657 مراجعه کنید. (مشارکت‌شده توسط Pablo Galindo، Batuhan Taskaya و Ammar Askar در bpo-43950.)

توجه

این قابلیت نیازمند ذخیره‌سازی موقعیت‌های ستون در اشیاء کد است که ممکن است به افزایش اندکی در مصرف حافظه‌ی مفسر و مصرف دیسک برای پرونده‌های کامپایل‌شده‌ی پایتون منجر شود. برای پرهیز از ذخیره‌سازی اطلاعات اضافی و غیرفعال کردن چاپ اطلاعات ردگیری اضافی، از گزینه‌ی خط فرمان -X no_debug_ranges یا متغیر محیطی PYTHONNODEBUGRANGES استفاده کنید.

PEP 654: گروه‌های استثنا و except*

PEP 654 ویژگی‌هایی زبانی معرفی می‌کند که به یک برنامه امکان می‌دهد تا چندین استثنای نامرتبط را به‌طور هم‌زمان برخاست دهد و مدیریت کند. نوع‌های توکار ExceptionGroup و BaseExceptionGroup امکان گروه‌بندی استثناها و برخاست دادن آن‌ها با هم را فراهم می‌کنند، و سینتکس جدید except*، except را برای تطبیق زیرگروه‌های گروه‌های استثنا تعمیم می‌دهد.

برای جزئیات بیشتر به PEP 654 مراجعه کنید.

(مشارکت‌شده توسط Irit Katriel در bpo-45292. PEP نوشته‌شده توسط Irit Katriel، Yury Selivanov و Guido van Rossum.)

PEP 678: می‌توان استثناها را با یادداشت‌ها غنی کرد

متد add_note() به BaseException اضافه شده است. از این متد می‌توان برای غنی‌سازی استثناها با اطلاعات زمینه‌ای که در زمان پرتاب استثنا در دسترس نیست، استفاده کرد. یادداشت‌های اضافه‌شده در ردگیری پشته‌ی پیش‌فرض ظاهر می‌شوند.

برای جزئیات بیشتر به PEP 678 مراجعه کنید.

(مشارکت‌شده توسط Irit Katriel در bpo-45607. PEP نوشته‌شده توسط Zac Hatfield-Dodds.)

بهبودهای راه‌انداز py.exe ویندوز

نسخه‌ی مدیر نصب پایتون که به همراه پایتون 3.11 ارائه می‌شود، به‌طور قابل توجهی به‌روزرسانی شده است. این راه‌انداز اکنون با استفاده از آرگومان -V:<company>/<tag> به‌جای آرگومان محدود -<major>.<minor>، از سینتکس شرکت/برچسب تعریف‌شده در PEP 514 پشتیبانی می‌کند. این امکان را فراهم می‌کند که توزیع‌هایی غیر از PythonCore — یعنی همان توزیعی که در python.org میزبانی می‌شود — راه‌اندازی شوند.

هنگام استفاده از گزینش‌گرهای -V:، می‌توان شرکت یا برچسب را حذف کرد، اما همه‌ی نصب‌ها جستجو خواهند شد. برای مثال، -V:OtherPython/ «بهترین» برچسب ثبت‌شده برای OtherPython را انتخاب می‌کند، در حالی که -V:3.11 یا -V:/3.11 «بهترین» توزیع دارای برچسب 3.11 را انتخاب می‌کند.

هنگام استفاده از آرگومان‌های قدیمی -<major>، -<major>.<minor>، -<major>-<bitness> یا -<major>.<minor>-<bitness>، تمام رفتار موجود از نسخه‌های گذشته باید حفظ شود و تنها نسخه‌های PythonCore انتخاب خواهند شد. با این حال، پسوند -64 اکنون به معنای «۳۲بیتی نیست» است (نه لزوماً x86-64)، زیرا پلتفرم‌های ۶۴بیتی متعددی پشتیبانی می‌شوند. ران‌تایم‌های ۳۲بیتی با بررسی برچسب ران‌تایم از نظر وجود پسوند -32 تشخیص داده می‌شوند. همه‌ی نسخه‌های پایتون از 3.5 به بعد این مورد را در ساخت‌های ۳۲بیتی خود گنجانده‌اند.

سایر تغییرات زبان

  • عبارت‌های واگشایی ستاره‌دار اکنون می‌توانند در دستورهای for استفاده شوند. (برای جزئیات بیشتر به bpo-46725 مراجعه کنید.)

  • درک‌ها ناهمگام اکنون درون درک‌ها در توابع ناهمگام مجاز هستند. در این حالت، درک‌های بیرونی به‌طور ضمنی ناهمگام می‌شوند. (مشارکت Serhiy Storchaka در bpo-33346.)

  • در دستورهای with و contextlib.ExitStack.enter_context() برای اشیایی که پروتکل مدیر زمینه را پشتیبانی نمی‌کنند، و در دستورهای async with و contextlib.AsyncExitStack.enter_async_context() برای اشیایی که پروتکل مدیر زمینه ناهمگام را پشتیبانی نمی‌کنند، اکنون به جای AttributeError استثنای TypeError پرتاب می‌شود. (مشارکت‌کننده: Serhiy Storchaka در bpo-12022 و bpo-44471.)

  • متد object.__getstate__() افزوده شد که پیاده‌سازی پیش‌فرض متد __getstate__() را فراهم می‌کند. copy کردن و pickle کردن نمونه‌های زیرکلاس‌های انواع توکار bytearray، set، frozenset، collections.OrderedDict، collections.deque، weakref.WeakSet و datetime.tzinfo اکنون ویژگی‌های نمونه را که به‌صورت جایگاه‌ها پیاده‌سازی‌شده‌اند، کپی و پیکل می‌کند. این تغییر یک عارضه‌ی جانبی ناخواسته دارد: برای اقلیت کوچکی از پروژه‌های موجود پایتون که انتظار وجود object.__getstate__() را ندارند، مشکل ایجاد می‌کند. برای دیدن بحث‌ها درباره‌ی راه‌حل‌های جایگزینی که چنین کدی ممکن است به آن‌ها نیاز داشته باشد، به کامنت‌های بعدی در gh-70766 مراجعه کنید. (مشارکت‌شده توسط Serhiy Storchaka در bpo-26579.)

  • گزینه‌ی خط فرمان -P و متغیر محیطی PYTHONSAFEPATH افزوده شدند که پیش‌افزودن خودکار پوشه‌ی اسکریپت به sys.path هنگام اجرای یک اسکریپت، یا پوشه‌ی فعلی هنگام استفاده از -c و -m را غیرفعال می‌کنند. این کار تضمین می‌کند که import فقط ماژول‌های کتابخانه استاندارد و ماژول‌های نصب‌شده را پیدا می‌کند، و از پوشاندن ناخواسته یا بدخواهانه‌ی ماژول‌ها توسط ماژول‌های موجود در یک پوشه‌ی محلی (که معمولاً قابل نوشتن توسط کاربر است) جلوگیری می‌کند. (مشارکت‌شده توسط Victor Stinner در gh-57684.)

  • گزینه‌ی "z" به زبان کوچک مشخصات قالب‌بندی اضافه شد که پس از گرد کردن به دقت قالب، صفر منفی را به صفر مثبت تبدیل می‌کند. برای جزئیات بیشتر به PEP 682 مراجعه کنید. (مشارکت‌شده توسط John Belmonte در gh-90153.)

  • بایت‌ها دیگر روی sys.path پذیرفته نمی‌شوند. پشتیبانی در جایی بین پایتون 3.2 و 3.6 از کار افتاد و کسی تا پس از انتشار پایتون 3.10.0 متوجه آن نشد. علاوه بر این، بازگرداندن پشتیبانی به دلیل برهم‌کنش‌های میان -b و sys.path_importer_cache هنگامی که ترکیبی از کلیدهای str و bytes وجود دارد، مشکل‌ساز خواهد بود. (مشارکت از Thomas Grainger در gh-91181.)

سایر تغییرات پیاده‌سازی سی‌پایتون

  • متدهای ویژه‌ی __complex__() برای complex و __bytes__() برای bytes به‌منظور پشتیبانی از پروتکل‌های typing.SupportsComplex و typing.SupportsBytes پیاده‌سازی شده‌اند. (با مشارکت Mark Dickinson و Donghee Na در bpo-24234.)

  • siphash13 به‌عنوان یک الگوریتم هش‌سازی داخلی جدید افزوده شده است. این الگوریتم ویژگی‌های امنیتی مشابهی با siphash24 دارد، اما برای ورودی‌های طولانی کمی سریع‌تر است. str، bytes و برخی نوع‌های دیگر اکنون از آن به‌عنوان الگوریتم پیش‌فرض برای hash() استفاده می‌کنند. PEP 552 پرونده‌های pyc مبتنی بر هش نیز اکنون از siphash13 استفاده می‌کنند. (مشارکت‌شده توسط اینادا نائوکی در bpo-29410.)

  • وقتی یک استثنای فعال توسط دستور raise بدون پارامتر دوباره raise می‌شود، ردگیری پشته‌ی متصل به این استثنا اکنون همیشه sys.exc_info()[1].__traceback__ است. این بدان معناست که تغییراتی که در بند except فعلی بر ردگیری پشته اعمال می‌شوند، در استثنای دوباره raise‌شده منعکس می‌شوند. (مشارکت‌شده توسط ایریت کاتریل در bpo-45711.)

  • بازنمایی وضعیت مفسر از استثناهای مدیریت‌شده (که با نام exc_info یا _PyErr_StackItem نیز شناخته می‌شود) اکنون تنها دارای فیلد exc_value است؛ exc_type و exc_traceback حذف شده‌اند، زیرا می‌توان آن‌ها را از exc_value به دست آورد. (مشارکت‌شده توسط Irit Katriel در bpo-45711.)

  • گزینه خط فرمان جدیدی با نام AppendPath برای نصاب ویندوز افزوده شده است. این گزینه رفتاری مشابه PrependPath دارد، اما پوشه‌های نصب و اسکریپت‌ها را به انتها اضافه می‌کند، نه به ابتدا. (مشارکت‌شده توسط Bastian Neuburger در bpo-44934.)

  • فیلد PyConfig.module_search_paths_set اکنون باید روی 1 تنظیم شود تا مقداردهی اولیه از PyConfig.module_search_paths برای مقداردهی اولیه‌ی sys.path استفاده کند. در غیر این صورت، مقداردهی اولیه مسیر را دوباره محاسبه کرده و مقادیری را که به module_search_paths افزوده شده‌اند جایگزین خواهد کرد.

  • خروجی گزینه‌ی --help اکنون در ۵۰ سطر/۸۰ ستون جا می‌شود. اطلاعات مربوط به متغیرهای محیطی پایتون و گزینه‌های -X اکنون به‌ترتیب با استفاده از پرچم‌های --help-env و --help-xoptions، و همچنین با گزینه‌ی جدید --help-all در دسترس است. (مشارکت‌شده توسط Éric Araujo در bpo-46142.)

  • تبدیل بین int و str در مبناهایی غیر از ۲ (دودویی)، ۴، ۸ (مبنای هشت)، ۱۶ (مبنای شانزده) یا ۳۲ — مانند مبنای ۱۰ (ده‌دهی) — در صورتی که تعداد ارقام به شکل رشته از حدی بیشتر باشد، اکنون استثنای ValueError ایجاد می‌کند تا از حملات احتمالی انکار سرویس ناشی از پیچیدگی الگوریتمی جلوگیری شود. این یک اقدام کاهش‌دهنده برای CVE 2020-10735 است. این حد را می‌توان با متغیر محیطی، پرچم خط فرمان یا APIهای sys پیکربندی یا غیرفعال کرد. مستندات محدودیت طول تبدیل رشته‌ای عدد صحیح را ببینید. حد پیش‌فرض ۴۳۰۰ رقم به شکل رشته است.

ماژول‌های جدید

  • tomllib: برای تجزیه‌ی TOML. برای جزئیات بیشتر PEP 680 را ببینید. (مشارکت‌شده توسط Taneli Hukkinen در bpo-40059.)

  • wsgiref.types: نوع‌های مخصوص WSGI برای بررسی نوع ایستا. (مشارکت‌شده توسط Sebastian Rittau در bpo-42012.)

ماژول‌های بهبود‌یافته

asyncio

  • کلاس TaskGroup افزوده شد؛ یک مدیر زمینه ناهمگام که گروهی از وظایف را نگه می‌دارد و هنگام خروج برای همه آن‌ها منتظر می‌ماند. برای کدهای جدید، استفاده از این کلاس به‌جای به‌کارگیری مستقیم create_task() و gather() توصیه می‌شود. (با مشارکت یوری سلیوانوف و دیگران در gh-90908.)

  • timeout() افزوده شد؛ یک مدیر زمینه ناهمگام برای تعیین مهلت زمانی روی عملیات‌های ناهمگام. برای کدهای جدید، استفاده از این تابع به‌جای استفاده مستقیم از wait_for() توصیه می‌شود. (مشارکت‌شده توسط Andrew Svetlov در gh-90927.)

  • کلاس Runner اضافه شد که سازوکار استفاده‌شده توسط run() را در دسترس قرار می‌دهد. (با مشارکت Andrew Svetlov در gh-91218.)

  • کلاس Barrier به همراه استثنای مرتبط BrokenBarrierError به پریمیتیوهای همگام‌سازی در کتابخانه asyncio اضافه شد. (مشارکت‌شده توسط Yves Duprat و Andrew Svetlov در gh-87518.)

  • آرگومان کلیدواژه‌ای all_errors به asyncio.loop.create_connection() افزوده شد تا بتوان چندین خطای اتصال را به‌صورت یک ExceptionGroup پرتاب کرد.

  • متد asyncio.StreamWriter.start_tls() برای ارتقای اتصالات موجودِ مبتنی بر جریان به TLS افزوده شد. (مشارکت‌شده توسط Ian Good در bpo-34975.)

  • توابع خام سوکت دیتاگرام به حلقه رویداد اضافه شدند: sock_sendto()، sock_recvfrom() و sock_recvfrom_into(). این توابع در SelectorEventLoop و ProactorEventLoop پیاده‌سازی شده‌اند. (مشارکت‌شده توسط Alex Grönholm در bpo-46805.)

  • متدهای cancelling() و uncancel() به Task افزوده شدند. این متدها عمدتاً برای استفاده داخلی در نظر گرفته شده‌اند، به‌ویژه توسط TaskGroup.

contextlib

  • مدیر زمینه‌ی chdir() که برای موازی‌سازی ایمن نیست، برای تغییر پوشه‌ی کاری جاری و سپس بازگردانی آن هنگام خروج اضافه شد. پوششی ساده حول chdir(). (مشارکت Filipe Laíns در bpo-25625)

dataclasses

  • تغییر در بررسی تغییرپذیری پیش‌فرض فیلد، به‌طوری‌که فقط پیش‌فرض‌هایی که هش‌پذیر هستند مجاز باشند، به‌جای هر شیئی که نمونه‌ای از dict، list یا set نباشد. (مشارکت‌شده توسط Eric V. Smith در bpo-44674.)

datetime

enum

  • نام EnumMeta به EnumType تغییر یافت (EnumMeta به عنوان نام مستعار حفظ شد).

  • کلاس StrEnum افزوده شد که اعضای آن می‌توانند به‌عنوان رشته استفاده شوند (و باید رشته باشند).

  • کلاس ReprEnum افزوده شد که تنها __repr__() اعضا را تغییر می‌دهد، در حالی که مقادیر لفظی آن‌ها (به‌جای نام‌ها) را برای __str__() و __format__() برمی‌گرداند (که توسط str()، format() و اف‌استرینگ استفاده می‌شوند).

  • متد Enum.__format__() (پیش‌فرض برای format()، str.format() و f-strings) تغییر کرد تا همیشه همان نتیجه‌ی Enum.__str__() را تولید کند: برای enumهایی که از ReprEnum ارث‌بری می‌کنند، مقدار عضو خواهد بود؛ برای همه‌ی enumهای دیگر، نام enum و نام عضو خواهد بود (مثلاً Color.RED).

  • پارامتر کلاس جدید boundary به enum‌های Flag و enum FlagBoundary به همراه گزینه‌های آن افزوده شد تا نحوه‌ی برخورد با مقادیر پرچم خارج از محدوده را کنترل کند.

  • دکوراتور enum verify() و enum EnumCheck به همراه گزینه‌های آن، برای بررسی کلاس‌های enum در برابر چندین محدودیت خاص افزوده شدند.

  • دکوراتورهای member() و nonmember() اضافه شدند تا اطمینان حاصل شود که شیء دکوراتورشده به عضو enum تبدیل می‌شود/نمی‌شود.

  • دکوراتور @~enum.property اضافه شد که مانند @property عمل می‌کند، به‌جز برای enum‌ها. به‌جای types.DynamicClassAttribute() از این استفاده کنید.

  • دکوراتور enum global_enum() اضافه شد که __repr__() و __str__() را طوری تنظیم می‌کند که مقادیر را به‌عنوان اعضای ماژول خودشان به‌جای کلاس enum نمایش دهد. برای مثال، 're.ASCII' برای عضو ASCII از re.RegexFlag به‌جای 'RegexFlag.ASCII'.

  • کلاس Flag بهبود یافت تا از len()، پیمایش و in/not in بر روی اعضای آن پشتیبانی کند. برای مثال، عبارت زیر اکنون کار می‌کند: len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)

  • Enum و Flag تغییر یافتند به‌طوری‌که اعضا اکنون پیش از فراخوانی __init_subclass__() تعریف می‌شوند؛ dir() اکنون متدها و غیره از نوع‌های داده‌ی میکس‌این را شامل می‌شود.

  • کلاس Flag تغییر کرد تا فقط مقادیر اصلی (توان دو) را کانونیکال در نظر بگیرد، در حالی که مقادیر مرکب (3، 6، 10 و غیره) به‌عنوان نام‌های مستعار در نظر گرفته می‌شوند؛ پرچم‌های معکوس به معادل مثبت خود تبدیل ضمنی می‌شوند.

fcntl

  • در FreeBSD، پرچم‌های F_DUP2FD و F_DUP2FD_CLOEXEC پشتیبانی می‌شوند که به ترتیب، اولی معادل استفاده از dup2 است و دومی علاوه بر آن پرچم FD_CLOEXEC را نیز تنظیم می‌کند.

fractions

  • پشتیبانی از مقداردهی اولیه‌ی Fraction از رشته به سبک PEP 515. (مشارکت‌شده توسط Sergey B Kirpichev در bpo-44258.)

  • Fraction اکنون یک متد __int__ را پیاده‌سازی می‌کند، به‌طوری که بررسی isinstance(some_fraction, typing.SupportsInt) پاس می‌شود. (ارائه‌شده توسط Mark Dickinson در bpo-44547.)

functools

  • @functools.singledispatch اکنون از types.UnionType و typing.Union به‌عنوان حاشیه‌نویسی برای آرگومان ارسال پشتیبانی می‌کند.:

    >>> from functools import singledispatch
    >>> @singledispatch
    ... def fun(arg, verbose=False):
    ...     if verbose:
    ...         print("Let me just say,", end=" ")
    ...     print(arg)
    ...
    >>> @fun.register
    ... def _(arg: int | float, verbose=False):
    ...     if verbose:
    ...         print("Strength in numbers, eh?", end=" ")
    ...     print(arg)
    ...
    >>> from typing import Union
    >>> @fun.register
    ... def _(arg: Union[list, set], verbose=False):
    ...     if verbose:
    ...         print("Enumerate this:")
    ...     for i, elem in enumerate(arg):
    ...         print(i, elem)
    ...
    

    (مشارکت‌شده توسط یوری کاراباس در bpo-46014.)

gzip

  • تابع gzip.compress() اکنون هنگامی که با آرگومان mtime=0 استفاده می‌شود، سریع‌تر است، زیرا فشرده‌سازی را به‌طور کامل به یک عملیات zlib.compress() واگذار می‌کند. این تغییر یک اثر جانبی دارد: پرونده gzip در سرآیند خود یک بایت «OS» دارد. این بایت به‌طور سنتی همیشه توسط ماژول gzip روی مقدار ۲۵۵ که نشان‌دهنده‌ی «نامعلوم» است تنظیم می‌شد. اکنون، هنگام استفاده از compress() با mtime=0، ممکن است این بایت توسط کتابخانه‌ی C زیرین zlib که پایتون با آن پیوند یافته است، روی مقدار متفاوتی تنظیم شود. (برای جزئیات درباره‌ی این اثر جانبی، gh-112346 را ببینید.)

hashlib

  • hashlib.blake2b() و hashlib.blake2s() اکنون libb2 را به نسخه‌ی داخلی (vendored) پایتون ترجیح می‌دهند. (مشارکت‌شده توسط Christian Heimes در bpo-47095.)

  • ماژول داخلی _sha3 با الگوریتم‌های SHA3 و SHAKE اکنون به‌جای Keccak Code Package از tiny_sha3 استفاده می‌کند تا حجم کد و پرونده دودویی کاهش یابد. ماژول hashlib پیاده‌سازی‌های بهینه‌شده‌ی SHA3 و SHAKE از OpenSSL را ترجیح می‌دهد. این تغییر فقط بر نصب‌هایی که از OpenSSL پشتیبانی نمی‌کنند تأثیر می‌گذارد. (مشارکت‌شده توسط Christian Heimes در bpo-47098.)

  • افزودن hashlib.file_digest()، تابعی کمکی برای هش‌سازی کارآمد پرونده‌ها یا اشیاء شبه‌پرونده. (ارائه‌شده توسط Christian Heimes در gh-89313.)

IDLE و idlelib

  • برجسته‌سازی سینتکس بر پرونده‌های .pyi اعمال شد. (با مشارکت Alex Waygood و Terry Jan Reedy در bpo-45447.)

  • گنجاندن اعلان‌ها هنگام ذخیره‌ی پوسته به‌همراه ورودی‌ها و خروجی‌ها. (مشارکت توسط Terry Jan Reedy در gh-95191.)

inspect

locale

  • تابع locale.getencoding() برای دریافت کدگذاری locale جاری اضافه شد. این تابع مشابه locale.getpreferredencoding(False) است، اما حالت UTF-8 پایتون را نادیده می‌گیرد.

logging

  • تابع getLevelNamesMapping() اضافه شد تا نگاشتی از نام‌های سطوح گزارش‌گیری (مانند 'CRITICAL') به مقادیر سطوح گزارش‌گیری متناظرشان (مانند 50، به‌طور پیش‌فرض) را برگرداند. (مشارکت Andrei Kulakovin در gh-88024.)

  • متد createSocket() به SysLogHandler اضافه شد تا با SocketHandler.createSocket() مطابقت داشته باشد. این متد به‌طور خودکار در طول مقداردهی اولیه‌ی هندلر و هنگام صدور یک رویداد، در صورت نبود سوکت فعال، فراخوانی می‌شود. (مشارکت‌شده توسط Kirill Pinchuk در gh-88457.)

math

  • افزودن math.exp2(): بازگرداندن ۲ به توان x. (مشارکت‌شده توسط گیدئون میچل در bpo-45917.)

  • افزودن math.cbrt(): بازگرداندن ریشه سوم x. (مشارکت‌شده توسط آجیت راماشاندران در bpo-44357.)

  • رفتار دو حالت گوشه‌ای از math.pow() برای سازگاری با مشخصات IEEE 754 تغییر کرد. عملیات‌های math.pow(0.0, -math.inf) و math.pow(-0.0, -math.inf) اکنون inf را برمی‌گردانند. قبلاً این عملیات‌ها استثنای ValueError را ایجاد می‌کردند. (مشارکت Mark Dickinson در bpo-44339.)

  • مقدار math.nan اکنون همیشه در دسترس است. (مشارکت‌شده توسط ویکتور استینر در bpo-46917.)

operator

  • تابع جدید operator.call افزوده شده است، به‌طوری‌که operator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (با مشارکت Antony Lee در bpo-44019.)

os

  • در ویندوز، os.urandom() اکنون به جای CryptGenRandom() که منسوخ شده است، از BCryptGenRandom() استفاده می‌کند. (مشارکت‌شده توسط Donghee Na در bpo-44611.)

pathlib

  • glob() و rglob() تنها پوشه‌ها را برمی‌گردانند اگر الگو به جداکننده‌ی اجزای مسیرنام ختم شود: sep یا altsep. (ارائه‌شده توسط ایسوکه کاواسوما در bpo-22276 و bpo-33392.)

re

  • گروه‌بندی اتمی ((?>...)) و کمیت‌گذارهای مالکانه (*+، ++، ?+، {m,n}+) اکنون در عبارات باقاعده پشتیبانی می‌شوند. (مشارکت‌شده توسط Jeffrey C. Jacobs و Serhiy Storchaka در bpo-433030.)

shutil

  • افزودن پارامتر اختیاری dir_fd در shutil.rmtree(). (مشارکت‌کرده: Serhiy Storchaka در bpo-46245.)

socket

  • پشتیبانی از سوکت CAN برای NetBSD افزوده شد. (با مشارکت Thomas Klausner در bpo-30512.)

  • create_connection() گزینه‌ای دارد که در صورت شکست در اتصال، به‌جای اینکه تنها آخرین خطا ایجاد شود، یک ExceptionGroup شامل تمام خطاها ایجاد می‌کند. (مشارکت‌شده توسط ایریت کاتریل در bpo-29980.)

sqlite3

  • اکنون می‌توانید مجوز‌دهنده (authorizer) را با ارسال None به set_authorizer() غیرفعال کنید. (مشارکت‌شده توسط Erlend E. Aasland در bpo-44491.)

  • نام ترتیب‌گذاریِ create_collation() اکنون می‌تواند شامل هر نویسه‌ی یونیکدی باشد. نام‌های ترتیب‌گذاری با نویسه‌های نامعتبر اکنون به جای sqlite3.ProgrammingError خطای UnicodeEncodeError ایجاد می‌کنند. (مشارکت‌شده توسط Erlend E. Aasland در bpo-44688.)

  • استثناهای sqlite3 اکنون کد خطای توسعه‌یافته‌ی SQLite را به‌صورت sqlite_errorcode و نام خطای SQLite را به‌صورت sqlite_errorname در بر می‌گیرند. (مشارکت‌شده توسط Aviv Palivoda، Daniel Shahaf و Erlend E. Aasland در bpo-16379 و bpo-24139.)

  • افزودن setlimit() و getlimit() به sqlite3.Connection برای تنظیم و دریافت محدودیت‌های SQLite به ازای هر اتصال. (با مشارکت Erlend E. Aasland در bpo-45243.)

  • sqlite3 اکنون sqlite3.threadsafety را بر اساس حالت نخ‌بندی پیش‌فرضی که کتابخانه‌ی زیربنایی SQLite با آن کامپایل شده است، تنظیم می‌کند. (مشارکت اِرلِند اِی. آسلاند در bpo-45613.)

  • کال‌بک‌های C ماژول sqlite3 اکنون در صورت فعال بودن ردگیری‌های کال‌بک، از استثناهای غیرقابل‌پرتاب (unraisable) استفاده می‌کنند. کاربران اکنون می‌توانند یک هندلر قلاب غیرقابل‌پرتاب (unraisable) ثبت کنند تا تجربه اشکال‌زدایی خود را بهبود بخشند. (مشارکت‌شده توسط Erlend E. Aasland در bpo-45828.)

  • واکشی در حین بازگردانی دیگر InterfaceError برنمی‌انگیزد. در عوض، مدیریت این موارد را به کتابخانه SQLite واگذار می‌کنیم. (مشارکت: Erlend E. Aasland در bpo-44092.)

  • متدهای serialize() و deserialize() برای سریال‌سازی و سریال‌زدایی پایگاه‌های داده به sqlite3.Connection افزوده شدند. (ارائه‌شده توسط Erlend E. Aasland در bpo-41930.)

  • افزودن create_window_function() به sqlite3.Connection برای ایجاد توابع پنجره‌ای تجمیعی. (مشارکت‌شده توسط ارلند ای. آسلند در bpo-34916.)

  • افزودن blobopen() به sqlite3.Connection. sqlite3.Blob امکان انجام عملیات ورودی/خروجی افزایشی بر روی بلاب‌ها را فراهم می‌کند. (مشارکت‌شده توسط آویو پالیوودا و ارلند ای. آسلند در bpo-24905.)

string

  • افزودن get_identifiers() و is_valid() به string.Template، که به ترتیب همه‌ی جای‌نگهدارهای معتبر و اینکه آیا جای‌نگهدار نامعتبری وجود دارد یا خیر را برمی‌گردانند. (مشارکت Ben Kehoe در gh-90465.)

sys

  • sys.exc_info() اکنون فیلدهای type و traceback را از value (نمونه‌ی استثنا) استخراج می‌کند؛ بنابراین وقتی استثنا در حین مدیریت آن تغییر داده شود، این تغییرات در نتایج فراخوانی‌های بعدی exc_info() منعکس می‌شوند. (مشارکت‌شده توسط Irit Katriel در bpo-45711.)

  • افزودن sys.exception() که نمونه استثنای فعال را برمی‌گرداند (معادل sys.exc_info()[1]). (مشارکت Irit Katriel در bpo-46328.)

  • افزودن پرچم sys.flags.safe_path. (مشارکت‌شده توسط Victor Stinner در gh-57684.)

sysconfig

  • سه طرح‌واره‌ی نصب جدید (posix_venv، nt_venv و venv) افزوده شدند و زمانی استفاده می‌شوند که پایتون محیط‌های مجازی جدید ایجاد کند یا از یک محیط مجازی در حال اجرا باشد. دو طرح‌واره‌ی نخست (posix_venv و nt_venv) مختص سیستم‌عامل‌اند و به ترتیب برای غیر ویندوز و ویندوز هستند؛ venv در واقع بسته به سیستم‌عاملی که پایتون روی آن اجرا می‌شود، مستعار یکی از آن‌هاست. این موضوع برای توزیع‌کنندگان پایین‌دستی که sysconfig.get_preferred_scheme() را تغییر می‌دهند مفید است. کد شخص ثالثی که محیط‌های مجازی جدید ایجاد می‌کند، باید برای تعیین مسیرها از طرح‌واره‌ی نصب جدید venv استفاده کند، همان‌طور که venv انجام می‌دهد. (مشارکت‌شده توسط Miro Hrončok در bpo-45413.)

tempfile

  • اشیاء SpooledTemporaryFile اکنون متدهای io.BufferedIOBase یا io.TextIOBase را به‌طور کامل پیاده‌سازی می‌کنند (بسته به حالت پرونده). این امر باعث می‌شود آن‌ها به‌درستی با APIهایی که انتظار شیء شبه‌پرونده دارند، مانند ماژول‌های فشرده‌سازی، کار کنند. (مشارکت از Carey Metcalfe در gh-70363.)

threading

  • در یونیکس، اگر تابع sem_clockwait() در کتابخانه C موجود باشد (glibc 2.30 و نسخه‌های جدیدتر)، متد threading.Lock.acquire() اکنون برای مهلت زمانی از ساعت یکنواخت (time.CLOCK_MONOTONIC) استفاده می‌کند، نه از ساعت سیستم (time.CLOCK_REALTIME)، تا از تغییرات ساعت سیستم تأثیر نپذیرد. (مشارکت‌شده توسط ویکتور استینر در bpo-41710.)

time

  • در یونیکس، time.sleep() اکنون در صورت موجود بودن، از تابع clock_nanosleep() یا nanosleep() استفاده می‌کند که وضوح ۱ نانوثانیه (10-9 ثانیه) دارد، به‌جای استفاده از select() که وضوح ۱ میکروثانیه (10-6 ثانیه) دارد. (با همکاری Benjamin Szőke و Victor Stinner در bpo-21302.)

  • در ویندوز 8.1 و جدیدتر، time.sleep() اکنون از یک تایمر انتظارپذیر (waitable timer) مبتنی بر تایمرهای با وضوح بالا استفاده می‌کند که وضوحی برابر با ۱۰۰ نانوثانیه (10-7 ثانیه) دارد. پیش از این، وضوح آن ۱ میلی‌ثانیه (10-3 ثانیه) بود. (مشارکت‌شده توسط Benjamin Szőke، Donghee Na، Eryk Sun و Victor Stinner در bpo-21302 و bpo-45429.)

tkinter

  • متد info_patchlevel() اضافه شد که نسخه دقیق کتابخانه Tcl را به‌صورت یک تاپل نام‌دار مشابه sys.version_info برمی‌گرداند. (مشارکت Serhiy Storchaka در gh-91827.)

traceback

typing

برای تغییرات عمده، به قابلیت‌های جدید مرتبط با راهنماهای نوع مراجعه کنید.

  • افزودن typing.assert_never() و typing.Never. typing.assert_never() برای درخواست از بررسی‌گر نوع جهت تأیید اینکه یک سطر از کد دسترس‌ناپذیر است، مفید است. در زمان اجرا، این تابع استثنای AssertionError را برمی‌اندازد. (مشارکت‌شده توسط Jelle Zijlstra در gh-90633.)

  • افزودن typing.reveal_type(). این تابع برای پرسیدن از بررسی‌گر نوع درباره‌ی اینکه چه نوعی را برای یک عبارت معین استنتاج کرده است، مفید است. در زمان اجرا، نوع مقدار دریافت‌شده را چاپ می‌کند. (مشارکت‌شده توسط Jelle Zijlstra در gh-90572.)

  • افزودن typing.assert_type(). این تابع برای اینکه از بررسی‌گر نوع بخواهید تأیید کند که نوعی که برای یک عبارت معین استنباط کرده است، با نوع داده‌شده مطابقت دارد، مفید است. در زمان اجرا، این تابع صرفاً مقدار دریافت‌شده را برمی‌گرداند. (مشارکت‌کرده توسط Jelle Zijlstra در gh-90638.)

  • نوع‌های typing.TypedDict اکنون می‌توانند عام باشند. (مشارکت‌شده توسط Samodya Abeysiriwardane در gh-89026.)

  • نوع‌های NamedTuple اکنون می‌توانند عام باشند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-43923.)

  • زیرکلاس‌سازی از typing.Any مجاز است. این برای پرهیز از خطاهای بررسی‌گر نوع مرتبط با کلاس‌های بسیار پویا، مانند ماک‌ها، مفید است. (مشارکت‌شده توسط Shantanu Jain در gh-91154.)

  • دکوراتور @typing.final اکنون ویژگی __final__ را روی شیء تزئین‌شده تنظیم می‌کند. (مشارکت‌شده توسط یله زیلسترا در gh-90500.)

  • از تابع typing.get_overloads() می‌توان برای درون‌نگری سربارگذاری‌های یک تابع استفاده کرد. از typing.clear_overloads() می‌توان برای پاک کردن تمام سربارگذاری‌های ثبت‌شده‌ی یک تابع استفاده کرد. (مشارکت‌شده توسط Jelle Zijlstra در gh-89263.)

  • متد __init__() در زیرکلاس‌های Protocol اکنون حفظ می‌شود. (مشارکت‌شده توسط Adrian Garcia Badarasco در gh-88970.)

  • نمایش نوع‌های تاپل خالی (Tuple[()]) ساده‌سازی شده است. این امر بر درون‌نگری تأثیر می‌گذارد؛ برای مثال، get_args(Tuple[()]) اکنون به جای ((),) به () ارزیابی می‌شود. (مشارکت‌شده توسط Serhiy Storchaka در gh-91137.)

  • سست‌کردن الزامات ران‌تایم برای حاشیه‌نویسی‌های نوع با حذف بررسی فراخوانی‌پذیری در تابع خصوصی typing._type_check. (مشارکت‌شده توسط گرگوری بورگارد در gh-90802.)

  • typing.get_type_hints() اکنون از ارزیابی رشته‌ها به‌عنوان ارجاع‌های پیشرو در مستعارهای عام PEP 585 پشتیبانی می‌کند. (مشارکت‌شده توسط Niklas Rosenstein در gh-85542.)

  • typing.get_type_hints() دیگر Optional را به پارامترهایی که مقدار پیش‌فرض آن‌ها None است اضافه نمی‌کند. (مشارکت‌شده توسط Nikita Sobolev در gh-90353.)

  • typing.get_type_hints() اکنون از ارزیابی حاشیه‌نویسی‌های رشته‌ایِ ساده‌ی ClassVar پشتیبانی می‌کند. (مشارکت از سوی Gregory Beauregard در gh-90711.)

  • @typing.no_type_check دیگر کلاس‌ها و توابع خارجی را تغییر نمی‌دهد. همچنین اکنون به‌درستی classmethodها را به‌عنوان مواردی که نباید از نظر نوع بررسی شوند علامت‌گذاری می‌کند. (با مشارکت Nikita Sobolev در gh-90729.)

unicodedata

  • پایگاه داده‌ی یونیکد به نسخه‌ی 14.0.0 به‌روزرسانی شده است. (مشارکت‌شده توسط Benjamin Peterson در bpo-45190).

unittest

venv

  • هنگامی که محیط‌های مجازی جدید پایتون ایجاد می‌شوند، venv از طرح‌واره نصب sysconfig برای تعیین مسیرهای درون محیط استفاده می‌کند. وقتی پایتون در یک محیط مجازی اجرا می‌شود، همان طرح‌واره نصب پیش‌فرض است. این بدان معناست که توزیع‌کنندگان پایین‌دست می‌توانند طرح‌واره نصب پیش‌فرض sysconfig را بدون تغییر رفتار محیط‌های مجازی تغییر دهند. کدهای شخص ثالثی که محیط‌های مجازی جدید ایجاد می‌کنند نیز باید همین کار را انجام دهند. (مشارکت‌شده توسط Miro Hrončok در bpo-45413.)

warnings

  • warnings.catch_warnings() اکنون آرگومان‌هایی برای warnings.simplefilter() می‌پذیرد و راهی مختصرتر برای نادیده گرفتن هشدارها به‌صورت محلی یا تبدیل آن‌ها به خطا فراهم می‌کند. (ارائه‌شده توسط Zac Hatfield-Dodds در bpo-47074.)

zipfile

  • پشتیبانی از تعیین کدگذاری نام عضو برای خواندن فراداده‌ها در پوشه و سرآیند‌های پرونده‌ی یک ZipFile اضافه شد. (مشارکت‌شده توسط Stephen J. Turnbull و Serhiy Storchaka در bpo-28080.)

  • ZipFile.mkdir() برای ایجاد پوشه‌های جدید درون آرشیوهای ZIP اضافه شد. (با مشارکت Sam Ezeh در gh-49083.)

  • stem، suffix و suffixes به zipfile.Path افزوده شدند. (مشارکت‌شده توسط میگل بریتو در gh-88261.)

بهینه‌سازی‌ها

این بخش بهینه‌سازی‌های خاصی را پوشش می‌دهد که مستقل از پروژه‌ی سی‌پایتون سریع‌تر (Faster CPython) هستند؛ آن پروژه در بخش اختصاصی خود پوشش داده شده است.

  • کامپایلر اکنون قالب‌بندی % به سبک printf ساده را روی رشته‌های لفظی که تنها شامل کدهای قالب %s، %r و %a هستند بهینه‌سازی می‌کند و آن را به سرعتِ عبارت f-string متناظر می‌رساند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-28307.)

  • تقسیم صحیح (//) برای بهینه‌سازی توسط کامپایلرها بهتر تنظیم شده است. اکنون در x86-64، هنگام تقسیم یک int بر مقداری کوچک‌تر از 2**30، حدود ۲۰٪ سریع‌تر است. (مشارکت‌شده توسط Gregory P. Smith و Tim Peters در gh-90564.)

  • sum() اکنون برای اعداد صحیح کوچک‌تر از 2**30 تقریباً ۳۰ درصد سریع‌تر است. (مشارکت‌شده توسط Stefan Behnel در gh-68264.)

  • تغییر اندازه فهرست‌ها برای حالت رایج ساده‌سازی شده است که list.append() را حدود ۱۵ درصد و درک فهرستی ساده را تا ۲۰ تا ۳۰ درصد سریع‌تر می‌کند (مشارکت‌شده توسط دنیس سوینی در gh-91165.)

  • دیکتشنری‌ها زمانی که همه کلیدها اشیای یونیکد باشند، مقادیر هش را ذخیره نمی‌کنند و این امر اندازه dict را کاهش می‌دهد. برای مثال، sys.getsizeof(dict.fromkeys("abcdefg")) روی پلتفرم‌های ۶۴ بیتی از ۳۵۲ بایت به ۲۷۲ بایت (۲۳٪ کوچک‌تر) کاهش می‌یابد. (مشارکت‌کرده توسط اینادا نائوکی در bpo-46845.)

  • استفاده از asyncio.DatagramProtocol هنگام انتقال پرونده‌های بزرگ از طریق UDP اکنون چند مرتبه بزرگی سریع‌تر است، با سرعتی بیش از ۱۰۰ برابر برای پرونده‌ای با حجم ≈60 MiB. (مشارکت msoxzw در gh-91487.)

  • توابع comb() و perm() در ماژول math اکنون برای آرگومان‌های بزرگ حدود ۱۰ برابر سریع‌تر هستند (با افزایش سرعت بیشتر برای k بزرگ‌تر). (مشارکت Serhiy Storchaka در bpo-37295.)

  • توابع mean()، variance() و stdev() در ماژول statistics اکنون پیمایش‌گرها را در یک گذر مصرف می‌کنند، به جای آنکه ابتدا آن‌ها را به list تبدیل کنند. این کار دو برابر سریع‌تر است و می‌تواند حافظه‌ی قابل‌توجهی صرفه‌جویی کند. (مشارکت‌شده توسط Raymond Hettinger در gh-90415.)

  • unicodedata.normalize() اکنون رشته‌های اسکی خالص را در زمان ثابت نرمال‌سازی می‌کند. (ارائه‌شده توسط Donghee Na در bpo-44987.)

سی‌پایتون سریع‌تر (Faster CPython)

بر اساس اندازه‌گیری با بدنه بنچمارک pyperformance، سی‌پایتون 3.11 هنگامی که با GCC روی اوبونتو لینوکس کامپایل شده باشد، به‌طور میانگین ۲۵ درصد سریع‌تر از سی‌پایتون 3.10 است. بسته به بار کاری شما، افزایش سرعت کلی می‌تواند ۱۰ تا ۶۰ درصد باشد.

این پروژه بر دو حوزه‌ی اصلی در پایتون تمرکز دارد: راه‌اندازی سریع‌تر و ران‌تایم سریع‌تر. بهینه‌سازی‌هایی که توسط این پروژه پوشش داده نمی‌شوند، به‌طور جداگانه در بهینه‌سازی‌ها فهرست شده‌اند.

راه‌اندازی سریع‌تر

ایمپورت‌های فریزشده / اشیاء کد ایستا

پایتون بایت‌کد را در پوشه‌ی __pycache__ نهانگاه می‌کند تا بارگذاری ماژول‌ها سریع‌تر شود.

قبلاً در 3.10، اجرای ماژول پایتون به این شکل بود:

خواندن __pycache__ -> مارشال‌گشایی -> شیء کد تخصیص‌یافته در هیپ -> ارزیابی

در پایتون 3.11، ماژول‌های هسته‌ای که برای راه‌اندازی پایتون ضروری هستند، «فریزشده» شده‌اند. این بدان معناست که اشیاء کد آن‌ها (و بایت‌کدشان) به‌صورت ایستا توسط مفسر تخصیص داده می‌شوند. این امر مراحل فرایند اجرای ماژول را به موارد زیر کاهش می‌دهد:

شیء کدِ تخصیص‌یافته به‌طور ایستا -> ارزیابی

راه‌اندازی مفسر در پایتون 3.11 اکنون ۱۰ تا ۱۵ درصد سریع‌تر است. این موضوع تأثیر بزرگی بر برنامه‌هایی دارد که زمان اجرای کوتاهی دارند و از پایتون استفاده می‌کنند.

(مشارکت‌شده توسط Eric Snow، Guido van Rossum و Kumar Aditya در بسیاری از مسائل .)

ران‌تایم سریع‌تر

فریم‌های ارزان‌تر و تنبلِ پایتون

فریم‌های پایتون، که اطلاعات اجرا را در خود نگه می‌دارند، هر زمان که پایتون یک تابع پایتون را فراخوانی کند ایجاد می‌شوند. موارد زیر بهینه‌سازی‌های جدید فریم هستند:

  • فرایند ایجاد فریم ساده‌سازی شد.

  • با استفاده مجدد سخاوتمندانه از فضای فریم روی پشته‌ی C، از تخصیص حافظه پرهیز شد.

  • ساختار داخلی فریم ساده‌سازی شد تا فقط اطلاعات ضروری را در بر بگیرد. فریم‌ها پیش‌تر اطلاعات اضافی برای اشکال‌زدایی و مدیریت حافظه را نگه می‌داشتند.

اکنون اشیای فریم به سبک قدیمی تنها زمانی ایجاد می‌شوند که اشکال‌زداها یا توابع درون‌نگری پایتون مانند sys._getframe() و inspect.currentframe() آن‌ها را درخواست کنند. در بیشتر کدهای کاربر، اصلاً هیچ شیء فریمی ایجاد نمی‌شود. در نتیجه، تقریباً همه‌ی فراخوانی‌های توابع پایتون به‌طور چشمگیری سریع‌تر شده‌اند. ما در pyperformance افزایش سرعت ۳ تا ۷ درصدی را اندازه‌گیری کردیم.

(با مشارکت مارک شانون در bpo-44590.)

فراخوانی‌های درون‌خطی توابع پایتون

هنگام فراخوانی یک تابع پایتون، پایتون یک تابع C ارزیاب را فراخوانی می‌کند تا کد آن تابع را تفسیر کند. این امر عملاً بازگشتی پایتون خالص را به آنچه برای پشته C ایمن است محدود می‌کند.

در نسخه‌ی 3.11، وقتی سی‌پایتون تشخیص می‌دهد که کد پایتون در حال فراخوانی تابع پایتونی دیگری است، یک فریم جدید ایجاد می‌کند و به کد جدید درون فریم جدید «می‌پرد». این کار از فراخوانی تابع تفسیر C به‌کلی اجتناب می‌کند.

بیشتر فراخوانی‌های تابع پایتون اکنون هیچ فضایی از پشته C مصرف نمی‌کنند، که این امر آن‌ها را سریع‌تر می‌کند. در توابع بازگشتی ساده‌ای مانند فیبوناچی یا فاکتوریل، افزایش سرعتی ۱.۷ برابری را مشاهده کردیم. این همچنین به این معناست که توابع بازگشتی می‌توانند تا عمق بسیار بیشتری به بازگشت ادامه دهند (اگر کاربر محدودیت بازگشت را با sys.setrecursionlimit() افزایش دهد). بهبود ۱ تا ۳ درصدی را در pyperformance اندازه‌گیری کردیم.

(با مشارکت پابلو گالیندو و مارک شانون در bpo-45256.)

PEP 659: مفسر تطبیقی تخصصی‌ساز (Specializing Adaptive Interpreter)

PEP 659 یکی از بخش‌های کلیدی پروژه Faster CPython است. ایده کلی این است که هرچند پایتون یک زبان پویاست، بیشترِ کدها نواحی‌ای دارند که در آن‌ها اشیاء و نوع‌ها به‌ندرت تغییر می‌کنند. این مفهوم با نام پایداری نوع شناخته می‌شود.

در زمان اجرا، پایتون تلاش می‌کند تا الگوهای رایج و پایداری نوع را در کد در حال اجرا بیابد. سپس پایتون عملیات فعلی را با عملیاتی تخصصی‌تر جایگزین می‌کند. این عملیات تخصصی از مسیرهای سریعی استفاده می‌کند که تنها برای آن موارد کاربرد/نوع‌ها در دسترس هستند و عموماً بهتر از همتاهای عام خود عمل می‌کنند. این امر مفهوم دیگری به نام نهانگاه‌سازی درون‌خطی (inline caching) را نیز به همراه می‌آورد که در آن پایتون نتایج عملیات‌های پرهزینه را مستقیماً در بایت‌کد نهانگاه‌سازی می‌کند.

ویژه‌ساز (specializer) همچنین برخی جفت‌های دستورالعمل رایج را در یک ابردستورالعمل (superinstruction) ادغام می‌کند و سربار حین اجرا را کاهش می‌دهد.

پایتون تنها زمانی تخصصی‌سازی (specialization) انجام می‌دهد که کدی را «داغ» (hot) ببیند (چندین‌بار اجرا شده باشد). این کار مانع می‌شود پایتون زمان خود را روی کدهایی که فقط یک‌بار اجرا می‌شوند تلف کند. پایتون همچنین می‌تواند وقتی کد بیش از حد پویاست یا وقتی نحوه استفاده تغییر می‌کند، تخصصی‌سازی را لغو کند (de-specialize). تلاش برای تخصصی‌سازی به‌صورت دوره‌ای انجام می‌شود و تلاش‌های تخصصی‌سازی بیش از حد پرهزینه نیستند، که این امر به تخصصی‌سازی اجازه می‌دهد با شرایط جدید سازگار شود.

(این PEP توسط Mark Shannon نوشته‌شده است، با ایده‌هایی الهام‌گرفته از Stefan Brunthaler. برای اطلاعات بیشتر به PEP 659 مراجعه کنید. پیاده‌سازی توسط Mark Shannon و Brandt Bucher انجام‌شده است، با کمک‌های بیشتر از سوی Irit Katriel و Dennis Sweeney.)

عملیات

فرم

تخصصی‌سازی

افزایش سرعت عملیات (حداکثر)

مشارکت‌کننده(ها)

عملیات دودویی

x + x

x - x

x * x

جمع، ضرب و تفریق دودویی برای نوع‌های رایج مانند int، float و str، برای نوع‌های زیربنایی خود مسیرهای سریع اختصاصی در پیش می‌گیرند.

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

زیرنویس

a[i]

زیرنویسی نوع‌های ظرفی مانند list، tuple و dict مستقیماً ساختارهای داده‌ی زیرین را اندیس‌گذاری می‌کند.

زیرنویسی __getitem__() سفارشی نیز مشابه فراخوانی‌های درون‌خطی توابع پایتون به‌صورت درون‌خطی درمی‌آید.

10-25%

Irit Katriel, Mark Shannon

ذخیره زیرنویس

a[i] = z

مشابه ویژه‌سازی (specialization) زیرنویسی در بالا.

10-25%

Dennis Sweeney

فراخوانی‌ها

f(arg)

C(arg)

فراخوانی توابع و نوع‌های توکار (C) رایج مانند len() و str، مستقیماً نسخه‌ی C زیرین آن‌ها را فراخوانی می‌کند. این کار از عبور از قرارداد فراخوانی داخلی جلوگیری می‌کند.

20%

Mark Shannon, Ken Jin

بارگذاری متغیر سراسری

print

len

اندیس شیء در فضای نام سراسری/توکار (globals/builtins) در نهانگاه ذخیره می‌شود. بارگذاری سراسری‌ها و توکارها به هیچ جستجوی فضای نام نیاز ندارد.

[1]

Mark Shannon

بارگذاری ویژگی

o.attr

مشابه بارگذاری متغیرهای سراسری. اندیس ویژگی درون فضای نام کلاس/شیء در نهانگاه ذخیره می‌شود. در بیشتر موارد، بارگذاری ویژگی به هیچ جستجویی در فضای نام نیاز نخواهد داشت.

[2]

Mark Shannon

بارگذاری متدها برای فراخوانی

o.meth()

نشانی واقعی متد در نهانگاه ذخیره می‌شود. بارگذاری متد اکنون هیچ جستجویی در فضای نام ندارد — حتی برای کلاس‌هایی با زنجیره‌های وراثت طولانی.

10-20%

Ken Jin, Mark Shannon

ذخیره‌سازی ویژگی

o.attr = z

مشابه بهینه‌سازی بارگذاری ویژگی.

۲٪ در pyperformance

Mark Shannon

واگشایی دنباله

*seq

برای ظرف‌های رایجی مانند list و tuple تخصصی‌سازی شده است. از قرارداد فراخوانی داخلی پرهیز می‌کند.

8%

Brandt Bucher

متفرقه

  • اشیاء اکنون به دلیل اینکه فضاهای نامشان به‌صورت تنبل ایجاد می‌شوند، به حافظه‌ی کمتری نیاز دارند. دیکشنری‌های فضای نام آن‌ها نیز اکنون کلیدها را آزادانه‌تر به اشتراک می‌گذارند. (مشارکت مارک شانون در bpo-45340 و bpo-40116.)

  • استثناهای «بدون هزینه» (zero-cost) پیاده‌سازی شده‌اند که هزینه‌ی دستورهای try را در زمانی که هیچ استثنایی رخ نمی‌دهد، از بین می‌برند. (با مشارکت Mark Shannon در bpo-40222.)

  • نمایش مختصرترِ استثناها در مفسر، زمان مورد نیاز برای گرفتن یک استثنا را حدود ۱۰ درصد کاهش داد. (مشارکت‌شده توسط Irit Katriel در bpo-45711.)

  • موتور تطبیق عبارت باقاعده‌ی ماژول re تا حدی بازآرایی شده است و اکنون در پلتفرم‌های پشتیبانی‌شده از پرش‌های محاسبه‌شده (computed gotos) (یا «کد زنجیره‌ای» (threaded code)) استفاده می‌کند. در نتیجه، پایتون 3.11 بنچمارک‌های عبارت باقاعده‌ی pyperformance را تا ۱۰٪ سریع‌تر از پایتون 3.10 اجرا می‌کند. (مشارکت‌شده توسط Brandt Bucher در gh-91404.)

پرسش‌های متداول

چگونه باید کد خودم را بنویسم تا از این افزایش‌های سرعت بهره ببرم؟

کد پایتونیک بنویسید که از بهترین شیوه‌های رایج پیروی کند؛ لازم نیست کد خود را تغییر دهید. پروژه Faster CPython برای الگوهای رایج کدی که ما مشاهده می‌کنیم بهینه‌سازی می‌کند.

آیا سی‌پایتون 3.11 از حافظه‌ی بیشتری استفاده می‌کند؟

شاید نه؛ انتظار نداریم مصرف حافظه نسبت به 3.10 بیش از ۲۰٪ بیشتر باشد. این موضوع با بهینه‌سازی‌های حافظه برای اشیاء فریم و دیکشنری‌های شیء که در بالا ذکر شد، جبران می‌شود.

هیچ افزایش سرعتی در بار کاری خود نمی‌بینم. چرا؟

برخی کدها سودمندی محسوسی نخواهند داشت. اگر کد شما بیشتر زمان خود را صرف عملیات ورودی/خروجی (I/O) می‌کند، یا از قبل بیشتر محاسبات خود را در یک کتابخانه توسعه‌ای C مانند NumPy انجام می‌دهد، افزایش سرعت چشمگیری حاصل نخواهد شد. این پروژه در حال حاضر بیشترین سود را به بارهای کاری پایتون خالص می‌رساند.

علاوه بر این، ارقام pyperformance یک میانگین هندسی هستند. حتی در میان بنچمارک‌های pyperformance، برخی بنچمارک‌ها اندکی کند شده‌اند، در حالی که برخی دیگر تقریباً ۲ برابر سریع‌تر شده‌اند!

آیا کامپایلر در لحظه (JIT) وجود دارد؟

خیر. ما همچنان در حال بررسی بهینه‌سازی‌های دیگر هستیم.

درباره

Faster CPython به بررسی بهینه‌سازی‌هایی برای CPython می‌پردازد. تیم اصلی توسط مایکروسافت تأمین مالی می‌شود تا به‌صورت تمام‌وقت روی این کار کند. پابلو گالیندو سالگادو نیز توسط Bloomberg LP تأمین مالی می‌شود تا به‌صورت پاره‌وقت روی این پروژه کار کند. در نهایت، بسیاری از مشارکت‌کنندگان داوطلبانی از کامیونیتی هستند.

تغییرات بایت‌کد سی‌پایتون

بایت‌کد اکنون شامل ورودی‌های نهانگاه درون‌خطی (inline cache) است که به شکل دستورالعمل‌های CACHE که به‌تازگی افزوده شده‌اند ظاهر می‌شوند. بسیاری از آپ‌کد‌ها انتظار دارند که تعداد دقیقی نهانگاه پس از آن‌ها قرار گیرد و به مفسر دستور می‌دهند که در زمان اجرا از روی این نهانگاه‌ها عبور کند. نهانگاه‌های پرشده می‌توانند شبیه دستورالعمل‌های دلخواه به نظر برسند؛ بنابراین هنگام خواندن یا تغییر بایت‌کد خام و تطبیقی حاوی داده‌های تسریع‌شده (quickened)، باید نهایت دقت را به کار برد.

آپ‌کد‌های جدید

آپ‌کد‌های جایگزین‌شده

آپ‌کد(های) جایگزین‌شده

آپ‌کد(های) جدید

نکته‌ها

BINARY_*
INPLACE_*

BINARY_OP

همه‌ی کدهای‌عمل دودویی/درجای عددی با یک آپ‌کد واحد جایگزین شدند

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

جابه‌جایی آرگومان‌ها برای متدها را از مدیریت آرگومان‌های کلیدواژه‌ای جدا می‌کند؛ امکان تخصصی‌سازی (specialization) بهتر فراخوانی‌ها را فراهم می‌کند

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

دستورهای دستکاری پشته

JUMP_IF_NOT_EXC_MATCH

اکنون بررسی انجام می‌دهد اما پرش نمی‌کند

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

ببینید [3]؛ گونه‌های TRUE، FALSE، NONE و NOT_NONE برای هر جهت

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

راه‌اندازی بلوک with

آپ‌کد‌های تغییر‌یافته/حذف‌شده

  • MATCH_CLASS و MATCH_KEYS تغییر کردند تا دیگر مقدار بولی اضافی برای نشان دادن موفقیت/شکست روی پشته قرار ندهند. در عوض، None در صورت شکست به جای تاپل مقادیر استخراج‌شده روی پشته قرار می‌گیرد.

  • کدهای عملی که با استثناها کار می‌کنند تغییر کردند تا بازتاب دهند که استثناها اکنون به‌جای سه آیتم، به‌صورت یک آیتم روی پشته نمایش داده می‌شوند (نگاه کنید به gh-89874).

  • COPY_DICT_WITHOUT_KEYS، GEN_START، POP_BLOCK، SETUP_FINALLY و YIELD_FROM حذف شدند.

منسوخ

این بخش API‌های پایتون را که در پایتون 3.11 منسوخ شده‌اند فهرست می‌کند.

APIهای منسوخ C به‌صورت جداگانه فهرست شده‌اند.

زبان/توکارها

  • زنجیره‌سازی توصیف‌گرهای classmethod (که در bpo-19072 معرفی شد) اکنون منسوخ شده است. دیگر نمی‌توان از آن برای پوشش دادن توصیف‌گرهای دیگر مانند property استفاده کرد. طراحی اصلی این قابلیت معیوب بود و باعث بروز تعدادی مشکل پایین‌دستی شد. برای «عبور دادن» (pass-through) یک classmethod، استفاده از ویژگی __wrapped__ (که در پایتون 3.10 اضافه شد) را در نظر بگیرید. (مشارکت‌شده توسط ریموند هتینگر در gh-89519.)

  • گریزهای مبنای هشت در مقادیر لفظی رشته و بایت که مقداری بزرگ‌تر از 0o377 (۲۵۵ در مبنای ده) دارند، اکنون یک DeprecationWarning تولید می‌کنند. در نسخه‌ای آینده از پایتون، این گریزها یک SyntaxWarning و در نهایت یک SyntaxError ایجاد خواهند کرد. (مشارکت‌شده توسط Serhiy Storchaka در gh-81548.)

  • واگذاری int() به __trunc__() اکنون منسوخ شده است. فراخوانی int(a) زمانی که type(a) __trunc__() را پیاده‌سازی می‌کند اما __int__() یا __index__() را پیاده‌سازی نمی‌کند، اکنون یک DeprecationWarning ایجاد می‌کند. (مشارکت‌شده توسط Zackery Spytz در bpo-44977.)

ماژول‌ها

  • PEP 594 منجر به منسوخ شدن ماژول‌های زیر شد که قرار بود در Python 3.13 حذف شوند:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (با مشارکت Brett Cannon در bpo-47061 و Victor Stinner در gh-68966.)

  • ماژول‌های asynchat، asyncore و smtpd دست‌کم از پایتون 3.6 منسوخ شده‌اند. مستندات و هشدارهای منسوخ‌شدگی آن‌ها اکنون به‌روزرسانی شده‌اند تا ذکر کنند که در پایتون 3.12 حذف خواهند شد. (مشارکت‌شده توسط Hugo van Kemenade در bpo-47022.)

  • بسته‌ی lib2to3 و ابزار 2to3 اکنون منسوخ شده‌اند و ممکن است نتوانند پایتون 3.10 یا جدیدتر را تجزیه کنند. برای جزئیات به PEP 617، که پارسر جدید PEG را معرفی می‌کند، مراجعه کنید. (با مشارکت Victor Stinner در bpo-40360.)

  • ماژول‌های مستندنشده sre_compile، sre_constants و sre_parse اکنون منسوخ شده‌اند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-47152.)

کتابخانه استاندارد

  • موارد زیر از زمان پایتون 3.2 در configparser منسوخ شده‌اند. هشدارهای منسوخ‌شدن آن‌ها اکنون به‌روزرسانی شده‌اند تا یادآور شوند که در پایتون 3.12 حذف خواهند شد:

    • کلاس configparser.SafeConfigParser

    • ویژگی configparser.ParsingError.filename

    • متد configparser.RawConfigParser.readfp()

    (مشارکت‌شده توسط هوگو ون کمِناده در bpo-45173.)

  • configparser.LegacyInterpolation از پایتون 3.2 در رشته مستند خود منسوخ اعلام شده و در مستندات configparser فهرست نشده است. این کلاس اکنون DeprecationWarning را نشان می‌دهد و در پایتون 3.13 حذف خواهد شد. به جای آن از configparser.BasicInterpolation یا configparser.ExtendedInterpolation استفاده کنید. (مشارکت‌شده توسط هوگو ون کمِناده در bpo-46607.)

  • مجموعه قدیمی‌تر توابع importlib.resources به نفع جایگزین‌های افزوده‌شده در Python 3.9 منسوخ شده‌اند و به دلیل پشتیبانی نکردن از منابع واقع در زیرپوشه‌های بسته، در نسخه‌ای آینده از پایتون حذف خواهند شد:

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • تابع locale.getdefaultlocale() منسوخ شده است و در پایتون 3.15 حذف خواهد شد. به جای آن از توابع locale.setlocale()، locale.getpreferredencoding(False) و locale.getlocale() استفاده کنید. (مشارکت‌شده توسط Victor Stinner در gh-90817.)

  • تابع locale.resetlocale() منسوخ شده است و در پایتون 3.13 حذف خواهد شد. به‌جای آن از locale.setlocale(locale.LC_ALL, "") استفاده کنید. (مشارکت‌شده توسط Victor Stinner در gh-90817.)

  • اکنون قواعد سخت‌گیرانه‌تری برای ارجاع‌های عددی به گروه‌ها و نام‌های گروه در عبارات باقاعده اعمال می‌شود. از این پس فقط دنباله‌هایی از ارقام اسکی به‌عنوان ارجاع عددی پذیرفته می‌شوند و نام گروه در الگوهای bytes و رشته‌های جایگزینی تنها می‌تواند شامل حروف اسکی، ارقام و زیرخط باشد. در حال حاضر، برای سینتکسی که این قواعد را نقض می‌کند، هشدار منسوخ‌شدن نشان داده می‌شود. (مشارکت‌شده توسط Serhiy Storchaka در gh-91760.)

  • در ماژول re، تابع re.template() و پرچم‌های متناظر re.TEMPLATE و re.T منسوخ شده‌اند، زیرا مستند نشده بودند و هدف روشنی نداشتند. این موارد در پایتون 3.13 حذف خواهند شد. (مشارکت‌شده توسط Serhiy Storchaka و Miro Hrončok در gh-92728.)

  • turtle.settiltangle() از پایتون 3.1 منسوخ شده است؛ این تابع اکنون هشدار منسوخ‌شدن منتشر می‌کند و در پایتون 3.13 حذف خواهد شد. به جای آن از turtle.tiltangle() استفاده کنید (این تابع پیش‌تر به اشتباه به عنوان منسوخ علامت‌گذاری شده بود و رشته مستند آن اکنون اصلاح شده است). (مشارکت‌شده توسط Hugo van Kemenade در bpo-45837.)

  • typing.Text که صرفاً برای فراهم‌کردن پشتیبانی از سازگاری بین کد پایتون 2 و پایتون 3 وجود دارد، اکنون منسوخ شده است. در حال حاضر برنامه‌ای برای حذف آن وجود ندارد، اما به کاربران توصیه می‌شود در هر جا که ممکن است، به جای آن از str استفاده کنند. (مشارکت‌شده توسط Alex Waygood در gh-92332.)

  • سینتکس آرگومان کلیدواژه‌ای برای ساخت نوع‌های typing.TypedDict اکنون منسوخ شده است. پشتیبانی از آن در پایتون 3.13 حذف خواهد شد. (مشارکت‌شده توسط Jingchen Ye در gh-90224.)

  • webbrowser.MacOSX منسوخ شده است و در پایتون 3.13 حذف خواهد شد. این کلاس آزمون‌نشده و مستندسازی‌نشده است و خودِ webbrowser از آن استفاده نمی‌کند. (مشارکت‌شده توسط Donghee Na در bpo-42255.)

  • رفتار برگرداندن مقدار از متدهای آزمون TestCase و IsolatedAsyncioTestCase (به‌جز مقدار پیش‌فرض None) اکنون منسوخ شده است.

  • توابع زیر از unittest که به‌طور رسمی مستند نشده‌اند، منسوخ شدند و برای حذف در پایتون 3.13 برنامه‌ریزی شده‌اند:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    به‌جای آن از متدهای TestLoader استفاده کنید:

    (ارائه‌شده توسط Erlend E. Aasland در bpo-5846.)

  • unittest.TestProgram.usageExit() به‌عنوان منسوخ علامت‌گذاری شده است و در 3.13 حذف خواهد شد. (مشارکت‌شده توسط Carlos Damázio در gh-67048.)

در انتظار حذف در پایتون 3.12

APIهای پایتون زیر در نسخه‌های پیشین منسوخ شده‌اند و در پایتون 3.12 حذف خواهند شد.

APIهای C که در انتظار حذف هستند، به‌صورت جداگانه فهرست شده‌اند.

  • ماژول asynchat

  • ماژول asyncore

  • کل بسته‌ی distutils

  • ماژول imp

  • فضای نام typing.io

  • فضای نام typing.re

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • متغیر محیطی PYTHONTHREADDEBUG

  • نام‌های مستعار منسوخِ زیر در unittest:

    نام مستعار منسوخ

    نام متد

    منسوخ در

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.5

حذف‌شده

این بخش APIهای پایتون را که در پایتون 3.11 حذف شده‌اند، فهرست می‌کند.

APIهای C حذف‌شده به‌صورت جداگانه فهرست شده‌اند.

  • decorator @asyncio.coroutine() که به هم‌روال‌های قدیمی مبتنی بر تولیدگر امکان می‌داد با کد async / await سازگار باشند، حذف شد. این تابع از پایتون 3.8 منسوخ شده بود و حذف آن در ابتدا برای پایتون 3.10 برنامه‌ریزی شده بود. به‌جای آن از async def استفاده کنید. (مشارکت‌شده توسط Illia Volochii در bpo-43216.)

  • کلاس asyncio.coroutines.CoroWrapper که در حالت اشکال‌زدایی برای پوشش دادن اشیای هم‌روال قدیمی مبتنی بر تولیدگر استفاده می‌شد، حذف شد. (نوشته‌شده توسط ایلیا ولوچی در bpo-43216.)

  • به دلیل نگرانی‌های امنیتی جدی، پارامتر reuse_address از asyncio.loop.create_datagram_endpoint() که در پایتون 3.9 غیرفعال شده بود، اکنون به‌طور کامل حذف شده است. دلیل این امر، رفتار گزینه‌ی سوکت SO_REUSEADDR در UDP است. (با مشارکت هوگو ون کمِناده در bpo-45129.)

  • ماژول binhex که در Python 3.9 منسوخ شده بود، حذف شد. همچنین توابع مرتبط در binascii که به‌طور مشابه منسوخ شده بودند، حذف شدند:

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    تابع binascii.crc_hqx() همچنان در دسترس است.

    (مشارکت‌شده توسط ویکتور استینر در bpo-45085.)

  • دستور bdist_msi در distutils که در پایتون 3.9 منسوخ شده بود، حذف شد. به‌جای آن از bdist_wheel (بسته‌های wheel) استفاده کنید. (مشارکت‌شده توسط Hugo van Kemenade در bpo-45124.)

  • متدهای __getitem__() از xml.dom.pulldom.DOMEventStream، wsgiref.util.FileWrapper و fileinput.FileInput که از پایتون 3.9 منسوخ شده بودند، حذف شدند. (مشارکت‌شده توسط Hugo van Kemenade در bpo-45132.)

  • توابع منسوخ gettext شامل lgettext()، ldgettext()، lngettext() و ldngettext() حذف شدند. همچنین تابع bind_textdomain_codeset()، متدهای NullTranslations.output_charset() و NullTranslations.set_output_charset() و پارامتر codeset از translation() و install() حذف شدند، زیرا آن‌ها فقط برای توابع l*gettext() استفاده می‌شوند. (مشارکت‌شده توسط Donghee Na و Serhiy Storchaka در bpo-44235.)

  • حذف‌شده از ماژول inspect:

    • تابع getargspec() که از پایتون 3.0 منسوخ شده است؛ به‌جای آن از inspect.signature() یا inspect.getfullargspec() استفاده کنید.

    • تابع formatargspec() که از پایتون 3.5 منسوخ شده است؛ مستقیماً از تابع inspect.signature() یا شیء inspect.Signature استفاده کنید.

    • متدهای مستندسازی‌نشده‌ی Signature.from_builtin() و Signature.from_function() که از پایتون 3.5 منسوخ شده‌اند؛ به‌جای آن‌ها از متد Signature.from_callable() استفاده کنید.

    (با مشارکت Hugo van Kemenade در bpo-45320.)

  • متد __class_getitem__() از pathlib.PurePath حذف شد، زیرا استفاده نمی‌شد و در نسخه‌های قبلی به اشتباه اضافه شده بود. (ارائه‌شده توسط Nikita Sobolev در bpo-46483.)

  • کلاس MailmanProxy در ماژول smtpd حذف شد، زیرا بدون بسته‌ی خارجی mailman قابل استفاده نیست. (مشارکت‌کننده: Donghee Na در bpo-35800.)

  • متد منسوخ split() از _tkinter.TkappType حذف شد. (مشارکت‌شده توسط Erlend E. Aasland در bpo-38371.)

  • پشتیبانی از بسته فضای نام از کشف آزمون unittest حذف شد. این قابلیت در پایتون 3.4 معرفی شد، اما از پایتون 3.7 به بعد خراب بوده است. (با مشارکت Inada Naoki در bpo-23882.)

  • متد خصوصی بدون مستندات float.__set_format__() که پیش‌تر در Python 3.7 با نام float.__setformat__() شناخته می‌شد، حذف شد. رشته مستند آن می‌گفت: «به احتمال زیاد نمی‌خواهید از این تابع استفاده کنید. این تابع عمدتاً برای استفاده در بدنه آزمون‌های پایتون وجود دارد.» (مشارکت‌شده توسط ویکتور استینر در bpo-46852.)

  • پرچم پیکربندی --experimental-isolated-subinterpreters (و ماکروی متناظر EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) حذف شده‌اند.

  • Pynche --- ویرایشگر رنگ و فام طبیعی به سبک پایتون --- از Tools/scripts خارج شده و به‌طور مستقل از درخت منبع پایتون در حال توسعه است.

مهاجرت به پایتون 3.11

این بخش، تغییرات پیش‌تر توضیح داده‌شده و سایر رفع اشکال‌ها در API پایتون را فهرست می‌کند که ممکن است نیازمند تغییراتی در کد پایتون شما باشند.

نکات انتقال برای API زبان C به‌صورت جداگانه فهرست شده‌اند.

  • open()، io.open()، codecs.open() و fileinput.FileInput دیگر 'U' («سطرهای جدید همگانی») را در حالت پرونده نمی‌پذیرند. در پایتون 3، هر زمان که پرونده‌ای در حالت متنی باز شود، به‌صورت پیش‌فرض از حالت «سطرهای جدید همگانی» استفاده می‌شود و پرچم 'U' از پایتون 3.3 منسوخ شده است. پارامتر newline این توابع کنترل می‌کند که سطرهای جدید همگانی چگونه کار می‌کنند. (مشارکت‌شده توسط Victor Stinner در bpo-37330.)

  • موقعیت‌های گره ast.AST اکنون هنگام ارائه به compile() و سایر توابع مرتبط اعتبارسنجی می‌شوند. در صورت تشخیص موقعیت‌های نامعتبر، یک ValueError پرتاب خواهد شد. (مشارکت‌شده توسط Pablo Galindo در gh-93351)

  • گذراندن اجراکننده‌های غیر concurrent.futures.ThreadPoolExecutor به asyncio.loop.set_default_executor() در پی منسوخ‌شدگی در پایتون 3.8 ممنوع شد. (با مشارکت Illia Volochii در bpo-43234.)

  • calendar: کلاس‌های calendar.LocaleTextCalendar و calendar.LocaleHTMLCalendar اکنون اگر locale‌ای تعیین نشده باشد، به جای استفاده از locale.getdefaultlocale()، از locale.getlocale() استفاده می‌کنند. (مشارکت‌شده توسط Victor Stinner در bpo-46659.)

  • ماژول pdb اکنون پرونده پیکربندی .pdbrc را با کدگذاری 'UTF-8' می‌خواند. (مشارکت‌شده توسط Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) در bpo-41137.)

  • پارامتر population در random.sample() باید یک دنباله باشد و تبدیل خودکار sets به lists دیگر پشتیبانی نمی‌شود. همچنین، اگر اندازه‌ی نمونه بزرگ‌تر از اندازه‌ی جمعیت باشد، یک ValueError نشان داده می‌شود. (مشارکت Raymond Hettinger در bpo-40465.)

  • پارامتر اختیاری random از random.shuffle() حذف شد. این پارامتر پیش‌تر تابع تصادفی دلخواهی بود که برای بر زدن استفاده می‌شد؛ اکنون همیشه از random.random() (پیش‌فرض قبلی آن) استفاده خواهد شد.

  • در سینتکس عبارت باقاعده ماژول re، پرچم‌های درون‌خطی سراسری (مانند (?i)) اکنون فقط می‌توانند در ابتدای عبارات باقاعده استفاده شوند. استفاده از آن‌ها در جای‌های دیگر، از پایتون 3.6 منسوخ شده است. (مشارکت‌شده توسط Serhiy Storchaka در bpo-47066.)

  • در ماژول re، چندین اشکال قدیمی برطرف شدند که در موارد نادر می‌توانستند باعث شوند گروه‌های ثبت‌کننده نتیجه‌ی نادرست بگیرند. بنابراین، این می‌تواند خروجی ثبت‌شده را در این موارد تغییر دهد. (مشارکت‌شده توسط Ma Lin در bpo-35859.)

تغییرات ساخت

  • سی‌پایتون اکنون طبق PEP 11 دارای پشتیبانی سطح ۳ برای کامپایل متقاطع به پلتفرم‌های WebAssembly یعنی Emscripten (wasm32-unknown-emscripten، یعنی پایتون در مرورگر) و WebAssembly System Interface (WASI) (wasm32-unknown-wasi) است. این تلاش از کارهای پیشین مانند Pyodide الهام‌گرفته است. این پلتفرم‌ها زیرمجموعه‌ی محدودی از APIهای POSIX را فراهم می‌کنند؛ قابلیت‌ها و ماژول‌های کتابخانه‌های استاندارد پایتون که با شبکه، فرایندها، نخ‌بندی، سیگنال‌ها، mmap و کاربران/گروه‌ها مرتبط هستند، در دسترس نیستند یا کار نمی‌کنند. (Emscripten با مشارکت Christian Heimes و Ethan Smith در gh-84461 و WASI با مشارکت Christian Heimes در gh-90473 ارائه شد؛ پلتفرم‌ها در gh-95085 ارتقا یافتند)

  • ساخت سی‌پایتون اکنون نیازمند موارد زیر است:

  • ماکروی Py_NO_NAN حذف شده است. از آنجا که سی‌پایتون اکنون به اعداد ممیز شناور IEEE 754 نیاز دارد، مقادیر NaN همیشه در دسترس هستند. (مشارکت‌شده توسط Victor Stinner در bpo-46656.)

  • بسته‌ی tkinter اکنون به Tcl/Tk نسخه‌ی 8.5.12 یا جدیدتر نیاز دارد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-46996.)

  • وابستگی‌های ساخت، پرچم‌های کامپایلر و پرچم‌های پیونددهنده برای بیشتر ماژول‌های توسعه‌ای کتابخانه استاندارد اکنون توسط configure تشخیص داده می‌شوند. پرچم‌های libffi، libnsl، libsqlite3، zlib، bzip2، liblzma، libcrypt، Tcl/Tk و uuid توسط pkg-config (در صورت موجود بودن) تشخیص داده می‌شوند. tkinter اکنون برای تشخیص تنظیمات توسعه سرآیندها و کتابخانه‌های Tcl/Tk به یک فرمان pkg-config نیاز دارد. (مشارکت‌شده توسط Christian Heimes و Erlend Egeberg Aasland در bpo-45847، bpo-45747 و bpo-45763.)

  • libpython دیگر به libcrypt پیوند نمی‌شود. (مشارکت‌شده توسط Mike Gilbert در bpo-45433.)

  • اکنون می‌توان سی‌پایتون را با گزینه‌ی ThinLTO از طریق ارسال thin به --with-lto ساخت، یعنی --with-lto=thin. (مشارکت داده‌شده توسط Donghee Na و Brett Holman در bpo-44340.)

  • اکنون می‌توان فری‌لیست‌های (freelist) مربوط به ساختارهای شیء را غیرفعال کرد. برای غیرفعال کردن همه‌ی فری‌لیست‌ها به‌جز تک‌نمونه‌ی تاپل خالی می‌توان از گزینه‌ی جدید --without-freelists در configure استفاده کرد. (با مشارکت Christian Heimes در bpo-45522.)

  • Modules/Setup و Modules/makesetup بهبود یافته و تکمیل شده‌اند. اکنون می‌توان ماژول‌های توسعه‌ای را از طریق makesetup ساخت. همه‌ی ماژول‌ها به‌جز برخی ماژول‌های آزمون را می‌توان به‌صورت ایستا به یک دودویی یا کتابخانه‌ی اصلی پیوند داد. (مشارکت‌شده توسط Brett Cannon و Christian Heimes در bpo-45548، bpo-45570، bpo-45571 و bpo-43974.)

    توجه

    از متغیرهای محیطی TCLTK_CFLAGS و TCLTK_LIBS استفاده کنید تا مکان سرآیندها و کتابخانه‌های Tcl/Tk را به‌صورت دستی مشخص کنید. گزینه‌های configure با نام‌های --with-tcltk-includes و --with-tcltk-libs حذف شده‌اند.

    در RHEL 7 و CentOS 7، بسته‌های توسعه tcl.pc و tk.pc را ارائه نمی‌دهند؛ از TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5" استفاده کنید. پوشه‌ی Misc/rhel7 شامل پرونده‌های .pc و دستورالعمل‌هایی درباره‌ی نحوه‌ی ساخت پایتون با Tcl/Tk و OpenSSL مربوط به RHEL 7 و CentOS 7 است.

  • سی‌پایتون اکنون به‌صورت پیش‌فرض برای پیاده‌سازی int پایتون از رقم‌های ۳۰ بیتی استفاده می‌کند. پیش‌تر، حالت پیش‌فرض استفاده از رقم‌های ۳۰ بیتی روی پلتفرم‌هایی با SIZEOF_VOID_P >= 8 و رقم‌های ۱۵ بیتی در غیر این صورت بود. همچنان می‌توان استفاده از رقم‌های ۱۵ بیتی را به‌طور صریح از طریق گزینه‌ی --enable-big-digits برای اسکریپت configure یا (برای ویندوز) متغیر PYLONG_BITS_IN_DIGIT در PC/pyconfig.h درخواست کرد، اما این گزینه ممکن است در زمانی در آینده حذف شود. (مشارکت Mark Dickinson در bpo-45569.)

تغییرات C API

ویژگی‌های جدید

مهاجرت به پایتون 3.11

  • برخی ماکروها برای پرهیز از دام‌های ماکرو، به توابع درون‌خطی ایستا تبدیل‌شده‌اند. این تغییر باید عمدتاً از دید کاربران پنهان باشد، زیرا توابع جایگزین، برای پرهیز از هشدارهای کامپایلر ناشی از بررسی‌های نوع ایستا، آرگومان‌های خود را به نوع‌های مورد انتظار تبدیل نوع می‌کنند. با این حال، وقتی C API محدود روی >=3.11 تنظیم‌شده باشد، این تبدیل‌های نوع انجام نمی‌شوند و فراخوان‌کنندگان باید آرگومان‌ها را به نوع‌های مورد انتظارشان تبدیل نوع کنند. برای جزئیات بیشتر به PEP 670 مراجعه کنید. (با مشارکت Victor Stinner و Erlend E. Aasland در gh-89653.)

  • تابع PyErr_SetExcInfo() دیگر از آرگومان‌های type و traceback استفاده نمی‌کند؛ مفسر اکنون این مقادیر را از نمونه‌ی استثنا (آرگومان value) به دست می‌آورد. این تابع همچنان ارجاع‌های هر سه آرگومان را می‌دزدد. (با مشارکت Irit Katriel در bpo-45711.)

  • PyErr_GetExcInfo() اکنون فیلد‌های type و traceback نتیجه را از نمونه‌ی استثنا (فیلد value) به دست می‌آورد. (مشارکت‌شده توسط Irit Katriel در bpo-45711.)

  • _frozen یک فیلد جدید is_package دارد که نشان می‌دهد ماژول فریزشده یک بسته است یا خیر. پیش‌تر، مقدار منفی در فیلد size نشانگر این موضوع بود. اکنون فقط مقادیر نامنفی برای size استفاده می‌شوند. (مشارکت‌شده توسط Kumar Aditya در bpo-46608.)

  • _PyFrameEvalFunction() اکنون به جای PyFrameObject*، _PyInterpreterFrame* را به‌عنوان پارامتر دوم خود می‌گیرد. برای جزئیات بیشتر درباره‌ی نحوه‌ی استفاده از این نوع اشاره‌گر تابع، به PEP 523 مراجعه کنید.

  • PyCode_New() و PyCode_NewWithPosOnlyArgs() اکنون یک آرگومان اضافی exception_table دریافت می‌کنند. تا حد امکان باید از استفاده از این توابع پرهیز کرد. برای به دست آوردن یک شیء کد سفارشی: یک شیء کد با استفاده از کامپایلر بسازید، سپس نسخه‌ی اصلاح‌شده‌ی آن را با متد replace به دست آورید.

  • PyCodeObject دیگر فیلدهای co_code، co_varnames، co_cellvars و co_freevars را ندارد. در عوض، برای دسترسی به آن‌ها از طریق API زبان C، به ترتیب از PyCode_GetCode()، PyCode_GetVarnames()، PyCode_GetCellvars() و PyCode_GetFreevars() استفاده کنید. (مشارکت Brandt Bucher در bpo-46841 و Ken Jin در gh-92154 و gh-94936.)

  • ماکروهای قدیمی سطل زباله (trashcan) (Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) اکنون منسوخ شده‌اند. آن‌ها باید با ماکروهای جدید Py_TRASHCAN_BEGIN و Py_TRASHCAN_END جایگزین شوند.

    تابع tp_dealloc که ماکروهای قدیمی را دارد، مانند:

    static void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_SAFE_BEGIN(p);
        ...
        Py_TRASHCAN_SAFE_END
    }
    

    باید به ماکروهای جدید به شرح زیر مهاجرت کنند:

    static void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_BEGIN(p, mytype_dealloc)
        ...
        Py_TRASHCAN_END
    }
    

    توجه داشته باشید که Py_TRASHCAN_BEGIN آرگومان دومی دارد که باید تابع تخصیص‌زدایی باشد؛ تابعی که این ماکرو در آن قرار دارد.

    برای پشتیبانی از نسخه‌های قدیمی‌تر پایتون در همان پایگاه کد (codebase)، می‌توانید ماکروهای زیر را تعریف کنید و در سراسر کد از آن‌ها استفاده کنید (منبع: این ماکروها از پایگاه کد mypy کپی شده‌اند):

    #if PY_VERSION_HEX >= 0x03080000
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
    #else
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
    #endif
    
  • تابع PyType_Ready() اکنون هنگامی خطا ایجاد می‌کند که نوعی با پرچم Py_TPFLAGS_HAVE_GC تنظیم‌شده تعریف شود، اما تابع پیمایش (PyTypeObject.tp_traverse) نداشته باشد. (مشارکت‌شده توسط Victor Stinner در bpo-44263.)

  • نوع‌های هیپ با پرچم Py_TPFLAGS_IMMUTABLETYPE اکنون می‌توانند پروتکل فراخوانی برداری (vectorcall) PEP 590 را به ارث ببرند. پیش‌تر، این تنها برای نوع‌های ایستا امکان‌پذیر بود. (مشارکت‌شده توسط Erlend E. Aasland در bpo-43908)

  • از آنجا که Py_TYPE() به یک تابع ایستای درون‌خطی تغییر یافته است، Py_TYPE(obj) = new_type باید با Py_SET_TYPE(obj, new_type) جایگزین شود: تابع Py_SET_TYPE() را ببینید (از پایتون 3.9 به بعد در دسترس است). برای سازگاری با نسخه‌های پیشین، می‌توان از این ماکرو استفاده کرد:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
    static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
    { ob->ob_type = type; }
    #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
    #endif
    

    (مشارکت‌شده توسط Victor Stinner در bpo-39573.)

  • از آنجا که Py_SIZE() به یک تابع ایستای درون‌خطی تبدیل شده است، عبارت Py_SIZE(obj) = new_size باید با Py_SET_SIZE(obj, new_size) جایگزین شود: تابع Py_SET_SIZE() را ببینید (از پایتون 3.9 در دسترس است). برای سازگاری با نسخه‌های پیشین، می‌توان از این ماکرو استفاده کرد:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
    static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
    { ob->ob_size = size; }
    #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
    #endif
    

    (مشارکت‌شده توسط Victor Stinner در bpo-39573.)

  • وقتی ماکروی Py_LIMITED_API روی 0x030b0000 (پایتون 3.11) یا بالاتر تنظیم شده باشد، <Python.h> دیگر پرونده‌های سرآیند <stdlib.h>، <stdio.h>، <errno.h> و <string.h> را شامل نمی‌شود. ماژول‌های توسعه‌ای C باید پس از #include <Python.h> پرونده‌های سرآیند را به‌طور صریح گنجانند. (مشارکت‌شده توسط Victor Stinner در bpo-45434.)

  • پرونده‌های API غیرمحدود cellobject.h، classobject.h، code.h، context.h، funcobject.h، genobject.h و longintrepr.h به پوشه‌ی Include/cpython منتقل شده‌اند. علاوه بر این، پرونده‌ی سرآیند eval.h حذف شد. این پرونده‌ها نباید مستقیماً گنجانده شوند، زیرا از قبل در Python.h گنجانده شده‌اند: Include Files. اگر این پرونده‌ها مستقیماً گنجانده شده‌اند، به‌جای آن‌ها Python.h را بگنجانید. (مشارکت‌شده توسط Victor Stinner در bpo-35134.)

  • ماکروی PyUnicode_CHECK_INTERNED() از API محدود C حذف شده است. این ماکرو هرگز در آنجا قابل استفاده نبود، زیرا از ساختارهای داخلی‌ای استفاده می‌کرد که در API محدود C در دسترس نیستند. (مشارکت‌شده توسط Victor Stinner در bpo-46007.)

  • توابع و نوع فریم زیر اکنون به‌طور مستقیم با #include <Python.h> در دسترس هستند و دیگر نیازی به افزودن #include <frameobject.h> نیست:

    (مشارکت‌شده توسط Victor Stinner در gh-93937.)

  • اعضای ساختار PyFrameObject از API عمومی C حذف شده‌اند.

    اگرچه مستندات اشاره می‌کند که فیلدهای PyFrameObject ممکن است در هر زمان تغییر کنند، این فیلدها مدت‌هاست پایدار بوده‌اند و در چندین توسعه‌ی محبوب استفاده شده‌اند.

    در پایتون 3.11، ساختار فریم بازآرایی شد تا بهینه‌سازی‌های کارایی ممکن شود. برخی از فیلدها به‌طور کامل حذف شدند، زیرا جزئیاتی از پیاده‌سازی قدیمی بودند.

    فیلد‌های PyFrameObject:

    • f_back: از PyFrame_GetBack() استفاده کنید.

    • f_blockstack: حذف شد.

    • f_builtins: از PyFrame_GetBuiltins() استفاده کنید.

    • f_code: از PyFrame_GetCode() استفاده کنید.

    • f_gen: از PyFrame_GetGenerator() استفاده کنید.

    • f_globals: از PyFrame_GetGlobals() استفاده کنید.

    • f_iblock: حذف شد.

    • f_lasti: از PyFrame_GetLasti() استفاده کنید. کدهایی که از f_lasti به‌همراه PyCode_Addr2Line() استفاده می‌کنند، باید به‌جای آن از PyFrame_GetLineNumber() استفاده کنند؛ ممکن است سریع‌تر باشد.

    • f_lineno: از PyFrame_GetLineNumber() استفاده کنید

    • f_locals: از PyFrame_GetLocals() استفاده کنید.

    • f_stackdepth: حذف شد.

    • f_state: API عمومی ندارد (به f_frame.f_state تغییر نام داده شد).

    • f_trace: API عمومی ندارد.

    • f_trace_lines: از PyObject_GetAttrString((PyObject*)frame, "f_trace_lines") استفاده کنید.

    • f_trace_opcodes: از PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes") استفاده کنید.

    • f_localsplus: API عمومی ندارد (تغییر نام یافته به f_frame.localsplus).

    • f_valuestack: حذف شد.

    شیء فریم پایتون اکنون به‌صورت تنبل ایجاد می‌شود. یک اثر جانبی این است که نباید به عضو f_back به‌طور مستقیم دسترسی پیدا کرد، زیرا مقدار آن نیز اکنون به‌صورت تنبل محاسبه می‌شود. در عوض، باید تابع PyFrame_GetBack() فراخوانی شود.

    اشکال‌زداهایی که مستقیماً به f_locals دسترسی داشتند، باید به جای آن PyFrame_GetLocals() را فراخوانی کنند. آن‌ها دیگر نیازی به فراخوانی PyFrame_FastToLocalsWithError() یا PyFrame_LocalsToFast() ندارند؛ در واقع نباید آن توابع را فراخوانی کنند. به‌روزرسانی لازم فریم اکنون توسط ماشین مجازی مدیریت می‌شود.

    کدی که PyFrame_GetCode() را در پایتون 3.8 و قدیمی‌تر تعریف می‌کند:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
    {
        Py_INCREF(frame->f_code);
        return frame->f_code;
    }
    #endif
    

    کدی که PyFrame_GetBack() را در پایتون 3.8 و نسخه‌های قدیمی‌تر تعریف می‌کند:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
    {
        Py_XINCREF(frame->f_back);
        return frame->f_back;
    }
    #endif
    

    یا برای به دست آوردن این دو تابع در نسخه‌های قدیمی‌تر پایتون، از پروژه‌ی pythoncapi_compat استفاده کنید.

  • تغییرات اعضای ساختار PyThreadState:

    • frame: حذف شد؛ از PyThreadState_GetFrame() استفاده کنید (تابعی که با bpo-40429 به پایتون 3.9 افزوده شد). هشدار: این تابع یک ارجاع قوی برمی‌گرداند؛ باید Py_XDECREF() را فراخوانی کنید.

    • tracing: تغییر کرده است؛ از PyThreadState_EnterTracing() و PyThreadState_LeaveTracing() استفاده کنید (توابعی که با bpo-43760 به پایتون 3.11 اضافه شدند).

    • recursion_depth: حذف شد؛ به‌جای آن از (tstate->recursion_limit - tstate->recursion_remaining) استفاده کنید.

    • stackcheck_counter: حذف شد.

    کدی که PyThreadState_GetFrame() را در پایتون 3.8 و قدیمی‌تر تعریف می‌کند:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
    {
        Py_XINCREF(tstate->frame);
        return tstate->frame;
    }
    #endif
    

    کدی که PyThreadState_EnterTracing() و PyThreadState_LeaveTracing() را در پایتون 3.10 و قدیمی‌تر تعریف می‌کند:

    #if PY_VERSION_HEX < 0x030B00A2
    static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
    {
        tstate->tracing++;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = 0;
    #else
        tstate->use_tracing = 0;
    #endif
    }
    
    static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
    {
        int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
        tstate->tracing--;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = use_tracing;
    #else
        tstate->use_tracing = use_tracing;
    #endif
    }
    #endif
    

    یا برای دریافت این توابع در توابع پایتون قدیمی، از پروژه‌ی pythoncapi-compat استفاده کنید.

  • توزیع‌کنندگان تشویق می‌شوند که پایتون را با کتابخانه بهینه‌شده Blake2 با نام libb2 بسازند.

  • اکنون باید فیلد PyConfig.module_search_paths_set روی 1 تنظیم شود تا مقداردهی اولیه از PyConfig.module_search_paths برای مقداردهی اولیه‌ی sys.path استفاده کند. در غیر این صورت، مقداردهی اولیه مسیر را دوباره محاسبه خواهد کرد و هر مقداری را که به module_search_paths افزوده شده باشد جایگزین خواهد کرد.

  • PyConfig_Read() دیگر مسیر جستجوی اولیه را محاسبه نمی‌کند و هیچ مقداری را در PyConfig.module_search_paths قرار نمی‌دهد. برای محاسبه‌ی مسیرهای پیش‌فرض و سپس تغییر آن‌ها، بوت‌استرپ را به پایان برسانید و با استفاده از PySys_GetObject()، sys.path را به‌عنوان یک شیء فهرست پایتونی بازیابی کنید و آن را مستقیماً تغییر دهید.

منسوخ

  • توابع زیر برای پیکربندی راه‌اندازی پایتون منسوخ شده‌اند:

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    به جای آن از API جدید PyConfig در پیکربندی مقداردهی اولیه پایتون استفاده کنید (PEP 587). (مشارکت‌شده توسط Victor Stinner در gh-88279.)

  • عضو ob_shash از PyBytesObject منسوخ شد. به جای آن از PyObject_Hash() استفاده کنید. (مشارکت‌شده توسط Inada Naoki در bpo-46864.)

در انتظار حذف در پایتون 3.12

APIهای C زیر در نسخه‌های پیشین پایتون منسوخ شده‌اند و در پایتون 3.12 حذف خواهند شد.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

حذف‌شده

  • PyFrame_BlockSetup() و PyFrame_BlockPop() حذف شده‌اند. (مشارکت‌شده توسط مارک شنون در bpo-40222.)

  • ماکروهای ریاضی زیر با استفاده از متغیر errno حذف شدند:

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    (مشارکت‌شده توسط Victor Stinner در bpo-45412.)

  • ماکروهای Py_UNICODE_COPY() و Py_UNICODE_FILL() که از پایتون 3.3 منسوخ شده بودند، حذف شدند. به‌جای آن‌ها از توابع PyUnicode_CopyCharacters() یا memcpy() (رشته‌ی wchar_t*) و PyUnicode_Fill() استفاده کنید. (مشارکت‌شده توسط ویکتور استینر در bpo-41123.)

  • پرونده‌ی سرآیند pystrhex.h حذف شد. این پرونده فقط شامل توابع خصوصی است. افزونه‌های C باید فقط پرونده‌ی سرآیند اصلی <Python.h> را شامل کنند. (مشارکت‌شده توسط Victor Stinner در bpo-45434.)

  • ماکروی Py_FORCE_DOUBLE() حذف شد. این ماکرو توسط ماکروی Py_IS_INFINITY() استفاده می‌شد. (مشارکت‌شده توسط Victor Stinner در bpo-45440.)

  • موارد زیر هنگامی که Py_LIMITED_API تعریف شده باشد، دیگر در دسترس نیستند:

    این‌ها بخشی از API محدود نیستند.

    (مشارکت‌شده توسط Victor Stinner در bpo-45474.)

  • حذف PyWeakref_GET_OBJECT() از C API محدود. این تابع هرگز کار نمی‌کرد، زیرا ساختار PyWeakReference در C API محدود مات است. (مشارکت‌شده توسط Victor Stinner در bpo-35134.)

  • ماکرو PyHeapType_GET_MEMBERS() حذف شد. این ماکرو به اشتباه در API عمومی C افشا شده بود و تنها باید به‌صورت داخلی توسط پایتون استفاده شود. در عوض از عضو PyTypeObject.tp_members استفاده کنید. (مشارکت‌شده توسط Victor Stinner در bpo-40170.)

  • ماکروی HAVE_PY_SET_53BIT_PRECISION حذف شد (به API داخلی C منتقل شد). (با مشارکت Victor Stinner در bpo-45412.)

  • APIهای کدگذارِ Py_UNICODE حذف شدند، زیرا از پایتون 3.3 منسوخ شده‌اند، کم استفاده می‌شوند و نسبت به جایگزین‌های توصیه‌شده ناکارآمد هستند.

    توابع حذف‌شده عبارت‌اند از:

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7()

    • PyUnicode_EncodeUTF8()

    • PyUnicode_EncodeUTF16()

    • PyUnicode_EncodeUTF32()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    برای جزئیات و راهنمای مهاجرت، به PEP 624 و راهنمای مهاجرت مراجعه کنید. (مشارکت‌شده توسط Inada Naoki در bpo-44029.)

تغییرات قابل توجه در 3.11.4

tarfile

  • متدهای استخراج در tarfile و shutil.unpack_archive() یک آرگومان filter جدید دارند که اجازه می‌دهد قابلیت‌های tar که ممکن است تعجب‌آور یا خطرناک باشند، مانند ایجاد پرونده‌ها خارج از پوشه‌ی مقصد، محدود شوند. برای جزئیات به فیلترهای استخراج مراجعه کنید. در پایتون 3.12، استفاده بدون آرگومان filter یک DeprecationWarning نمایش خواهد داد. در پایتون 3.14، مقدار پیش‌فرض به 'data' تغییر خواهد کرد. (مشارکت‌شده توسط Petr Viktorin در PEP 706.)

تغییرات قابل توجه در 3.11.5

OpenSSL

  • نسخه‌های ویندوز و نصب‌کننده‌های macOS از python.org اکنون از OpenSSL 3.0 استفاده می‌کنند.