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

ویرایشگر:

Adam Turner

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

همچنین ملاحظه نمائید

PEP 693 -- زمان‌بندی انتشار Python 3.12

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

پایتون 3.12 یک نسخه پایدار از زبان برنامه‌نویسی پایتون است که ترکیبی از تغییرات در زبان و کتابخانه استاندارد را در بر می‌گیرد. تغییرات کتابخانه بر پاک‌سازی API‌های منسوخ، کاربردپذیری و درستی متمرکز هستند. شایان ذکر است که بسته distutils از کتابخانه استاندارد حذف شده است. پشتیبانی از سامانه فایل‌بندی در os و pathlib بهبودهای متعددی داشته است و چندین ماژول نیز کارایی بهتری دارند.

تغییرات زبان بر کاربردپذیری تمرکز دارند، زیرا بسیاری از محدودیت‌های اف‌استرینگ‌ها برداشته شده‌اند و پیشنهادهای «آیا منظورتان ... بود؟» همچنان بهبود می‌یابند. سینتکس جدید پارامتر نوع و دستور type، ارگونومی استفاده از نوع‌های عام و مستعارهای نوع به همراه بررسی‌گرهای نوع ایستا را بهبود می‌بخشند.

این مقاله تلاش نمی‌کند مشخصات کامل همه‌ی ویژگی‌های جدید را ارائه دهد، بلکه در عوض مروری مناسب ارائه می‌کند. برای جزئیات کامل، باید به مستنداتی مانند مرجع کتابخانه و مرجع زبان مراجعه کنید. اگر می‌خواهید پیاده‌سازی کامل و منطق طراحی یک تغییر را درک کنید، به PEP (پیشنهاد بهبود پایتون) مربوط به ویژگی جدید مورد نظر مراجعه کنید؛ اما توجه داشته باشید که PEPها معمولاً پس از پیاده‌سازی کامل یک ویژگی، به‌روز نگه داشته نمی‌شوند.


ویژگی‌های جدید سینتکس:

  • PEP 695، سینتکس پارامتر نوع و دستور type

قابلیت‌های جدید دستور زبان:

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

بهبودهای مدل داده پایتون:

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

  • کلاس pathlib.Path اکنون از زیرکلاس‌سازی پشتیبانی می‌کند

  • ماژول os چندین بهبود برای پشتیبانی از ویندوز دریافت کرد

  • یک رابط خط فرمان به ماژول sqlite3 اضافه شده است

  • بررسی‌های isinstance() در برابر پروتکل‌های بررسی‌پذیر در زمان اجرا بین دو تا ۲۰ برابر سریع‌تر شده‌اند

  • بسته‌ی asyncio تعدادی بهبود عملکرد داشته است، به‌طوری‌که برخی آزمون‌های محک (benchmark) افزایش سرعت ۷۵ درصدی را نشان می‌دهند.

  • یک رابط خط فرمان به ماژول uuid اضافه شده است

  • به دلیل تغییرات در PEP 701، تولید توکن‌ها از طریق ماژول tokenize تا ۶۴٪ سریع‌تر شده است.

بهبودهای امنیتی:

  • پیاده‌سازی‌های توکار hashlib برای SHA1، SHA3، SHA2-384، SHA2-512 و MD5 با کد تأییدشده به‌صورت صوری از پروژه‌ی HACL* جایگزین شدند. این پیاده‌سازی‌های توکار به‌عنوان جایگزین باقی می‌مانند و تنها زمانی استفاده می‌شوند که OpenSSL آن‌ها را ارائه نمی‌کند.

بهبودهای C API:

  • PEP 697، لایه‌ی ناپایدار C API

  • PEP 683، اشیاء نامیرا

بهبودهای پیاده‌سازی سی‌پایتون:

  • PEP 709، درون‌خطی‌سازی (inlining) درک‌ها

  • پشتیبانی سی‌پایتون برای پروفایل‌گیر perf لینوکس

  • پیاده‌سازی حفاظت در برابر سرریز پشته روی پلتفرم‌های پشتیبانی‌شده

ویژگی‌های جدید تایپینگ:

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

  • PEP 623: حذف wstr از اشیاء یونیکد در C API پایتون، که اندازه‌ی هر شیء str را حداقل ۸ بایت کاهش می‌دهد.

  • PEP 632: بسته‌ی distutils حذف شد. برای راهنمایی درباره‌ی جایگزینی APIهایی که فراهم می‌کرد، به راهنمای مهاجرت مراجعه کنید. بسته‌ی شخص ثالث Setuptools همچنان distutils را فراهم می‌کند، اگر هنوز در پایتون 3.12 و پس از آن به آن نیاز دارید.

  • gh-95299: setuptools در محیط‌های مجازی ایجادشده با venv پیش‌نصب نشود. این بدان معناست که distutils، setuptools، pkg_resources و easy_install به‌طور پیش‌فرض دیگر در دسترس نخواهند بود؛ برای دسترسی به آن‌ها، pip install setuptools را در محیط مجازی فعال‌شده اجرا کنید.

  • ماژول‌های asynchat، asyncore و imp به همراه چندین مستعار متد از unittest.TestCase حذف شده‌اند.

قابلیت‌های جدید

PEP 695: سینتکس پارامتر نوع

کلاس‌ها و توابع عام در PEP 484 با استفاده از سینتکس پرگویایی اعلان می‌شدند که محدوده‌ی پارامترهای نوع را مبهم می‌گذاشت و اعلان‌های صریح وردایی را الزامی می‌کرد.

PEP 695 روشی جدید، فشرده‌تر و صریح‌تر برای ایجاد کلاس‌های عام و توابع معرفی می‌کند:

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

علاوه بر این، PEP (پیشنهاد بهبود پایتون) روش جدیدی برای اعلام مستعارهای نوع با استفاده از دستور type معرفی می‌کند که نمونه‌ای از TypeAliasType ایجاد می‌کند:

type Point = tuple[float, float]

مستعارهای نوع همچنین می‌توانند عام باشند:

type Point[T] = tuple[T, T]

سینتکس جدید امکان تعریف پارامترهای TypeVarTuple و ParamSpec و همچنین پارامترهای TypeVar با کران‌ها یا محدودیت‌ها را فراهم می‌کند:

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints

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

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

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

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

(PEP توسط Eric Traut نوشته شده است. پیاده‌سازی توسط Jelle Zijlstra، Eric Traut و دیگران در gh-103764 انجام شده است.)

PEP 701: صوری‌سازی نحوی اف‌استرینگ‌ها

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

  • بازاستفاده از علامت نقل‌قول: در پایتون 3.11، استفاده مجدد از همان علامت‌های نقل‌قولی که اف‌استرینگ دربرگیرنده از آن‌ها استفاده می‌کند، یک SyntaxError ایجاد می‌کند و کاربر را مجبور می‌کند که از یکی از سایر علامت‌های نقل‌قول موجود استفاده کند (مانند استفاده از علامت نقل‌قول دوتایی یا سه‌تایی، در صورتی که اف‌استرینگ از علامت نقل‌قول تکی استفاده کند). در پایتون 3.12، اکنون می‌توانید کارهایی مانند این انجام دهید:

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    توجه داشته باشید که پیش از این تغییر، هیچ محدودیت صریحی در نحوه تودرتو شدن اف‌استرینگ‌ها وجود نداشت، اما این واقعیت که علامت‌های نقل‌قول رشته را نمی‌توان در جزء عبارت اف‌استرینگ‌ها بازاستفاده کرد، تودرتو کردن اف‌استرینگ‌ها به شکل دلخواه را غیرممکن می‌کرد. در واقع، این تودرتوترین اف‌استرینگی است که می‌شد نوشت:

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

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

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • عبارت‌ها و کامنت‌های چندسطری: در پایتون 3.11، عبارت‌های اف‌استرینگ باید در یک سطر واحد تعریف شوند، حتی اگر عبارت درون اف‌استرینگ به‌طور معمول بتواند چند سطر را در بر بگیرد (مانند فهرست‌های لفظی که در چند سطر تعریف می‌شوند)، که این امر خواندن آن‌ها را دشوارتر می‌کند. در پایتون 3.12 اکنون می‌توانید اف‌استرینگ‌هایی تعریف کنید که چند سطر را در بر می‌گیرند و کامنت‌های درون‌خطی اضافه کنید:

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • بک‌اسلش‌ها و نویسه‌های یونیکد: پیش از پایتون 3.12، عبارت‌های اف‌استرینگ نمی‌توانستند هیچ نویسه‌ی \ داشته باشند. این موضوع بر دنباله‌های خنثی‌سازی یونیکد (مانند \N{snowman}) نیز اثر می‌گذاشت، زیرا این دنباله‌ها شامل بخش \N هستند که پیش‌تر نمی‌توانست بخشی از اجزای عبارت اف‌استرینگ‌ها باشد. اکنون می‌توانید عبارت‌هایی مانند این تعریف کنید:

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

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

به‌عنوان یک اثر جانبی مثبت از نحوه پیاده‌سازی این قابلیت (با تجزیه اف‌استرینگ‌ها توسط پارسر PEG)، اکنون پیام‌های خطای اف‌استرینگ‌ها دقیق‌تر هستند و مکان دقیق خطا را در بر می‌گیرند. برای مثال، در پایتون 3.11، اف‌استرینگ زیر یک SyntaxError ایجاد می‌کند:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

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

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(با مشارکت Pablo Galindo، Batuhan Taskaya، Lysandros Nikolaou، Cristián Maureira-Fredes و Marta Gómez در gh-102856. PEP نوشته‌شده توسط Pablo Galindo، Batuhan Taskaya، Lysandros Nikolaou و Marta Gómez).

PEP 684: قفل مفسر سراسری به ازای هر مفسر

PEP 684 یک قفل مفسر سراسری برای هر مفسر معرفی می‌کند، به‌طوری‌که اکنون می‌توان زیرمفسر‌ها را با یک قفل مفسر سراسری یکتا برای هر مفسر ایجاد کرد. این امر به برنامه‌های پایتون اجازه می‌دهد که به‌طور کامل از چندین هسته‌ی CPU بهره ببرند. این قابلیت در حال حاضر فقط از طریق C-API در دسترس است، هرچند یک API پایتونی برای 3.13 پیش‌بینی شده است.

برای ایجاد مفسری با قفل مفسر سراسری مخصوص به خود، از تابع جدید Py_NewInterpreterFromConfig() استفاده کنید:

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* مفسر جدید اکنون در نخ فعلی فعال است. */

برای مثال‌های بیشتر درباره‌ی نحوه‌ی استفاده از C-API برای زیرمفسر‌ها با قفل مفسر سراسری (GIL) اختصاصی هر مفسر، به Modules/_xxsubinterpretersmodule.c مراجعه کنید.

(مشارکت‌شده توسط اریک اسنو در gh-104210 و غیره.)

PEP 669: نظارت کم‌تأثیر برای سی‌پایتون

PEP 669 یک API جدید تعریف می‌کند که به پروفایل‌گیرها، اشکال‌زداها و دیگر ابزارها امکان می‌دهد رویدادها را در سی‌پایتون پایش کنند. این API طیف گسترده‌ای از رویدادها را در بر می‌گیرد، از جمله فراخوانی‌ها، بازگشت‌ها، سطرها، استثناها، پرش‌ها و موارد دیگر. این بدان معناست که فقط بابت آنچه استفاده می‌کنید هزینه می‌پردازید و همین امر پشتیبانی از اشکال‌زداها و ابزارهای پوشش با سربار نزدیک به صفر را فراهم می‌کند. برای جزئیات به sys.monitoring مراجعه کنید.

(مشارکت‌شده توسط مارک شانون در gh-103082.)

PEP 688: دسترس‌پذیر کردن پروتکل بافر در پایتون

PEP 688 راهی برای استفاده از پروتکل بافر در کد پایتون معرفی می‌کند. کلاس‌هایی که متد __buffer__() را پیاده‌سازی می‌کنند، اکنون به‌عنوان نوع‌های بافر قابل استفاده‌اند.

کلاس پایه انتزاعی جدید collections.abc.Buffer راهی استاندارد برای بازنمایی اشیاء بافر فراهم می‌کند، برای مثال در حاشیه‌نویسی نوع. enum جدید inspect.BufferFlags پرچم‌هایی را نمایش می‌دهد که می‌توان از آن‌ها برای سفارشی‌سازی ایجاد بافر استفاده کرد. (ارائه‌شده توسط Jelle Zijlstra در gh-102500.)

PEP 709: درون‌خطی‌سازی درک‌ها

درک‌های دیکشنری، فهرست و مجموعه اکنون به‌صورت درون‌خطی (inlined) درمی‌آیند، به‌جای آنکه برای هر اجرای درک، یک شیء تابع جدید یک‌بارمصرف ساخته شود. این امر سرعت اجرای یک درک را تا دو برابر افزایش می‌دهد. برای جزئیات بیشتر به PEP 709 مراجعه کنید.

متغیرهای پیمایش درک مجزا باقی می‌مانند؛ متغیری با همان نام در محدوده بیرونی را بازنویسی نمی‌کنند و پس از درک نیز قابل مشاهده نیستند. درون‌خطی‌سازی چند تغییر رفتاری قابل مشاهده به همراه دارد:

  • دیگر در ردگیری‌ها فریم جداگانه‌ای برای درک وجود ندارد، و ردگیری/پروفایل‌گیری دیگر درک را به‌عنوان فراخوانی تابع نشان نمی‌دهد.

  • ماژول symtable دیگر برای هر درک، جدول‌های نماد فرزند تولید نخواهد کرد؛ در عوض، متغیرهای محلی درک در جدول نماد تابع والد گنجانده خواهند شد.

  • فراخوانی locals() درون یک درک اکنون متغیرهای بیرون از درک را شامل می‌شود و دیگر متغیر مصنوعی .0 برای «آرگومان» درک را شامل نمی‌شود.

  • درکی که مستقیماً روی locals() پیمایش می‌کند (مثلاً [k for k in locals()]) ممکن است هنگامی که تحت ردیابی اجرا شود (مثلاً اندازه‌گیری پوشش کد) با خطای "RuntimeError: dictionary changed size during iteration" روبه‌رو شود. این همان رفتاری است که از قبل در مواردی مانند for k in locals(): دیده می‌شود. برای پرهیز از این خطا، ابتدا فهرستی از کلیدها برای پیمایش ایجاد کنید: keys = list(locals()); [k for k in keys].

(مشارکت‌شده توسط Carl Meyer و Vladimir Matveev در PEP 709.)

پیام‌های خطای بهبود‌یافته

  • اکنون هنگامی که NameError به بالاترین سطح پرتاب می‌شود، ممکن است ماژول‌های کتابخانه استاندارد به‌عنوان بخشی از پیام‌های خطایی که مفسر نمایش می‌دهد پیشنهاد شوند. (مشارکت‌شده توسط Pablo Galindo در gh-98254.)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • پیشنهاد خطا در استثناهای NameError برای نمونه‌ها بهبود یافت. اکنون اگر یک NameError در یک متد مطرح شود و نمونه ویژگی‌ای داشته باشد که دقیقاً برابر با نام موجود در استثنا باشد، پیشنهاد به‌جای نزدیک‌ترین تطابق در محدوده متد، شامل self.<NAME> خواهد بود. (مشارکت‌شده توسط Pablo Galindo در gh-99139.)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • پیام خطای SyntaxError هنگامی که کاربر به‌جای from y import x عبارت import x from y را تایپ می‌کند، بهبود یافت. (مشارکت‌شده توسط پابلو گالیندو در gh-98931.)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • استثناهای ImportError که از دستورهای ناموفق from <module> import <name> ایجاد می‌شوند، اکنون بر اساس نام‌های موجود در <module> پیشنهادهایی برای مقدار <name> در بر می‌گیرند. (مشارکت‌شده توسط پابلو گالیندو در gh-91058.)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

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

  • پارسر اکنون هنگام تجزیه کد منبع حاوی بایت‌های تهی، خطای SyntaxError ایجاد می‌کند. (مشارکت از پابلو گالیندو در gh-96670.)

  • جفت بک‌اسلش-نویسه‌ای که دنباله گریز معتبری نیست، اکنون به‌جای DeprecationWarning یک SyntaxWarning تولید می‌کند. برای مثال، re.compile("\d+\.\d+") اکنون یک SyntaxWarning منتشر می‌کند ("\d" یک دنباله گریز نامعتبر است؛ برای عبارت باقاعده از رشته‌های خام استفاده کنید: re.compile(r"\d+\.\d+")). در یک نسخه‌ی آینده پایتون، سرانجام به‌جای SyntaxWarning یک SyntaxError مطرح خواهد شد. (مشارکت‌شده توسط Victor Stinner در gh-98401.)

  • گریزهای مبنای هشت با مقدار بزرگ‌تر از 0o377 (مثلاً "\477") که در پایتون 3.11 منسوخ شده بودند، اکنون به‌جای DeprecationWarning یک SyntaxWarning تولید می‌کنند. در نسخه‌ای آینده از پایتون، آن‌ها سرانجام به SyntaxError تبدیل خواهند شد. (مشارکت‌شده توسط Victor Stinner در gh-98401.)

  • متغیرهایی که در بخش هدف درک‌ها استفاده می‌شوند اما در آن‌ها ذخیره‌سازی انجام نمی‌شود، اکنون می‌توانند در عبارت‌های انتساب (:=) به کار روند. برای نمونه، در [(b := 1) for a, b.prop in some_iter]، انتساب به b اکنون مجاز است. توجه داشته باشید که انتساب به متغیرهایی که در بخش هدف درک‌ها در آن‌ها ذخیره‌سازی انجام می‌شود (مانند a)، مطابق PEP 572 همچنان مجاز نیست. (مشارکت‌شده توسط نیکیتا سوبولف در gh-100581.)

  • استثناهایی که در متد __set_name__ یک کلاس یا نوع ایجاد می‌شوند، دیگر توسط RuntimeError در بر گرفته نمی‌شوند. اطلاعات زمینه به‌عنوان یک یادداشت PEP 678 به استثنا افزوده می‌شود. (با مشارکت Irit Katriel در gh-77757.)

  • وقتی یک ساختار try-except* کل ExceptionGroup را مدیریت می‌کند و استثنای دیگری مطرح می‌کند، آن استثنا دیگر در یک ExceptionGroup پوشش داده نمی‌شود. همچنین در نسخه‌ی 3.11.4 تغییر کرد. (نوشته‌شده توسط Irit Katriel در gh-103590.)

  • زباله‌روب اکنون فقط بر اساس سازوکار ارزیاب‌شکن (eval breaker) حلقه ارزیابی بایت‌کد پایتون اجرا می‌شود، نه بر اساس تخصیص اشیاء. زباله‌روب همچنین می‌تواند هنگام فراخوانی PyErr_CheckSignals() اجرا شود تا افزونه‌های C که باید برای مدت طولانی بدون اجرای هیچ کد پایتونی اجرا شوند نیز فرصتی داشته باشند که زباله‌روب را به‌طور دوره‌ای اجرا کنند. (مشارکت‌شده توسط پابلو گالیندو در gh-97922.)

  • همه‌ی فراخوانی‌پذیرهای توکار و توسعه‌ای که انتظار پارامترهای بولی را دارند، اکنون آرگومان‌هایی از هر نوع را می‌پذیرند، نه فقط bool و int. (نوشته‌شده توسط Serhiy Storchaka در gh-60203.)

  • memoryview اکنون از نوع ممیز شناور با دقت نصف پشتیبانی می‌کند (کد قالب "e"). (مشارکت‌شده توسط Donghee Na و Antoine Pitrou در gh-90751.)

  • اشیاء slice اکنون هش‌پذیر هستند و می‌توان از آن‌ها به‌عنوان کلیدهای دیکشنری و آیتم‌های مجموعه استفاده کرد. (با مشارکت Will Bradshaw، Furkan Onder و Raymond Hettinger در gh-101264.)

  • sum() اکنون از جمع‌زنی نومایر (Neumaier summation) برای بهبود دقت و جابه‌جایی هنگام جمع کردن اعداد اعشاری یا ترکیبی از اعداد صحیح و اعشاری استفاده می‌کند. (مشارکت‌شده توسط Raymond Hettinger در gh-100425.)

  • ast.parse() اکنون هنگام تجزیه‌ی کد منبع حاوی بایت‌های تهی، به‌جای ValueError استثنای SyntaxError مطرح می‌کند. (مشارکت‌شده توسط پابلو گالیندو در gh-96670.)

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

  • نمونه‌های types.MappingProxyType اکنون در صورتی هش‌پذیر هستند که نگاشت زیرین هش‌پذیر باشد. (مشارکت‌شده توسط Serhiy Storchaka در gh-87995.)

  • افزودن پشتیبانی از پروفایل‌گیر perf از طریق متغیر محیطی جدید PYTHONPERFSUPPORT و گزینه خط فرمان -X perf، و همچنین توابع جدید sys.activate_stack_trampoline()، sys.deactivate_stack_trampoline() و sys.is_stack_trampoline_active(). (طراحی توسط Pablo Galindo. مشارکت‌شده توسط Pablo Galindo و Christian Heimes با همکاری Gregory P. Smith [Google] و Mark Shannon در gh-96123.)

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

  • None.

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

array

  • کلاس array.array اکنون از زیرنویسی پشتیبانی می‌کند و این آن را به یک نوع عام تبدیل می‌کند. (مشارکت‌شده توسط Jelle Zijlstra در gh-98658.)

asyncio

  • کارایی نوشتن در سوکت‌ها در asyncio به‌طور چشمگیری بهبود یافته است. asyncio اکنون هنگام نوشتن در سوکت‌ها از کپی‌کردن غیرضروری پرهیز می‌کند و در صورتی که پلتفرم از آن پشتیبانی کند، از sendmsg() استفاده می‌کند. (مشارکت Kumar Aditya در gh-91166.)

  • توابع asyncio.eager_task_factory() و asyncio.create_eager_task_factory() اضافه شدند تا امکان فعال‌سازی اجرای فوری (eager) وظیفه‌ها در حلقه رویداد فراهم شود و برخی موارد استفاده ۲ تا ۵ برابر سریع‌تر شوند. (ارائه‌شده توسط Jacob Bower و Itamar Oren در gh-102853، gh-104140 و gh-104138)

  • در لینوکس، asyncio در صورتی که os.pidfd_open() در دسترس و کارا باشد، به‌طور پیش‌فرض به‌جای asyncio.ThreadedChildWatcher از asyncio.PidfdChildWatcher استفاده می‌کند. (با مشارکت Kumar Aditya در gh-98024.)

  • حلقه رویداد اکنون از بهترین پایشگر فرزند (child watcher) موجود برای هر پلتفرم استفاده می‌کند (asyncio.PidfdChildWatcher در صورت پشتیبانی و در غیر این صورت asyncio.ThreadedChildWatcher)، بنابراین پیکربندی دستی پایشگر فرزند توصیه نمی‌شود. (مشارکت‌شده توسط Kumar Aditya در gh-94597.)

  • پارامتر loop_factory به asyncio.run() اضافه شد تا بتوان یک کارخانه‌ی سفارشی حلقه رویداد را مشخص کرد. (مشارکت Kumar Aditya در gh-99388.)

  • افزودن پیاده‌سازی C برای asyncio.current_task() با افزایش سرعت ۴ تا ۶ برابری. (مشارکت توسط Itamar Oren و Pranav Thulasiram Bhat در gh-100344.)

  • asyncio.iscoroutine() اکنون برای تولیدگرها False برمی‌گرداند، زیرا asyncio از هم‌روال‌های قدیمی مبتنی بر تولیدگر پشتیبانی نمی‌کند. (مشارکت‌شده توسط Kumar Aditya در gh-102748.)

  • asyncio.wait() و asyncio.as_completed() اکنون تولیدگرهایی که وظیفه تولید می‌کنند را می‌پذیرند. (مشارکت Kumar Aditya در gh-78530.)

calendar

  • enum‌های calendar.Month و calendar.Day که ماه‌های سال و روزهای هفته را تعریف می‌کنند، اضافه شدند. (مشارکت‌شده توسط Prince Roshan در gh-103636.)

csv

dis

  • کدهای عمل شبه‌دستور (که توسط کامپایلر استفاده می‌شوند، اما در بایت‌کد اجرایی ظاهر نمی‌شوند) اکنون در ماژول dis در معرض نمایش قرار گرفته‌اند. HAVE_ARGUMENT همچنان برای کدهای عمل واقعی مرتبط است، اما برای شبه‌دستورها مفید نیست. به‌جای آن از مجموعه‌ی جدید dis.hasarg استفاده کنید. (مشارکت‌شده توسط Irit Katriel در gh-94216.)

  • افزودن مجموعه‌ی dis.hasexc برای نشان دادن دستورالعمل‌هایی که هندلر استثنا را تنظیم می‌کنند. (مشارکت‌شده توسط Irit Katriel در gh-94216.)

fractions

  • اشیاء از نوع fractions.Fraction اکنون از قالب‌بندی به سبک اعشاری پشتیبانی می‌کنند. (مشارکت‌شده توسط Mark Dickinson در gh-100161.)

importlib.resources

inspect

itertools

  • افزودن itertools.batched() برای جمع‌آوری در تاپل‌های هم‌اندازه که در آن آخرین دسته ممکن است کوتاه‌تر از بقیه باشد. (مشارکت‌شده توسط Raymond Hettinger در gh-98363.)

math

  • افزودن math.sumprod() برای محاسبه‌ی مجموع حاصل‌ضرب‌ها. (مشارکت‌شده توسط Raymond Hettinger در gh-100485.)

  • تابع math.nextafter() توسعه یافت تا شامل آرگومان steps برای حرکت به بالا یا پایین چندین گام در هر بار شود. (مشارکت Matthias Goergens، Mark Dickinson و Raymond Hettinger در gh-94906.)

os

  • ثابت os.PIDFD_NONBLOCK افزوده شد تا بتوان با استفاده از os.pidfd_open() توصیف‌گر پرونده‌ای را برای یک فرایند در حالت غیرمسدود باز کرد. (مشارکت‌شده توسط Kumar Aditya در gh-93312.)

  • os.DirEntry اکنون شامل متد os.DirEntry.is_junction() برای بررسی اتصال بودن ورودی است. (مشارکت‌شده توسط Charles Machalow در gh-99547.)

  • افزودن توابع os.listdrives()، os.listvolumes() و os.listmounts() در ویندوز برای شمارش درایوها، حجم‌ها و نقاط اتصال. (مشارکت‌شده توسط Steve Dower در gh-102519.)

  • os.stat() و os.lstat() اکنون در ویندوز دقیق‌تر هستند. فیلد st_birthtime اکنون با زمان ایجاد پرونده پر می‌شود، و st_ctime منسوخ شده است اما همچنان شامل زمان ایجاد است (اما در آینده، برای سازگاری با سکوهای دیگر، آخرین تغییر فراداده را بازخواهد گرداند). بسته به سامانه فایل‌بندی شما، st_dev ممکن است تا ۶۴ بیت و st_ino تا ۱۲۸ بیت باشد، و st_rdev همیشه به‌جای مقادیر نادرست، روی صفر تنظیم می‌شود. هر دو تابع ممکن است در نسخه‌های جدیدتر ویندوز به‌طور قابل‌توجهی سریع‌تر باشند. (مشارکت‌شده توسط Steve Dower در gh-99726.)

os.path

  • تابع os.path.isjunction() برای بررسی اینکه آیا یک مسیر داده‌شده اتصال است یا خیر، افزوده شد. (مشارکت‌شده توسط Charles Machalow در gh-99547.)

  • تابع os.path.splitroot() برای تجزیه‌ی یک مسیر به سه‌تایی (drive, root, tail) افزوده شد. (مشارکت‌شده توسط Barney Gale در gh-101000.)

pathlib

  • افزودن پشتیبانی از زیرکلاس‌سازی pathlib.PurePath و pathlib.Path، به‌همراه گونه‌های مخصوص Posix و Windows آن‌ها. زیرکلاس‌ها می‌توانند متد pathlib.PurePath.with_segments() را بازنویسی کنند تا اطلاعات را بین نمونه‌های مسیر منتقل کنند.

  • افزودن pathlib.Path.walk() برای پیمایش درخت‌های پوشه و تولید تمام نام‌های پرونده یا پوشه درون آن‌ها، مشابه os.walk(). (مشارکت‌شده توسط Stanislav Zmiev در gh-90385.)

  • افزودن پارامتر اختیاری walk_up به pathlib.PurePath.relative_to() برای اجازه‌دادن به درج ورودی‌های .. در نتیجه؛ این رفتار با os.path.relpath() سازگاری بیشتری دارد. (مشارکت‌شده توسط Domenico Ragusa در gh-84538.)

  • افزودن pathlib.Path.is_junction() به‌عنوان پراکسی برای os.path.isjunction(). (مشارکت Charles Machalow در gh-99547.)

  • افزودن پارامتر اختیاری case_sensitive به pathlib.Path.glob()، pathlib.Path.rglob() و pathlib.PurePath.match() برای تطبیق بر اساس حساسیت به بزرگی و کوچکی حروف مسیر، که امکان کنترل دقیق‌تری بر فرایند تطبیق را فراهم می‌کند.

platform

  • پشتیبانی از تشخیص ویندوز ۱۱ و نسخه‌های ویندوز سرور پس از ۲۰۱۲ اضافه شد. پیش‌تر، جستجوها روی پلتفرم‌های ویندوز سرور جدیدتر از ویندوز سرور ۲۰۱۲ و روی ویندوز ۱۱ مقدار Windows-10 را برمی‌گرداندند. (مشارکت استیو داور در gh-89545.)

pdb

  • افزودن متغیرهای کمکی (convenience variables) برای نگه‌داری موقت مقادیر در طول نشست اشکال‌زدایی و فراهم‌کردن دسترسی سریع به مقادیری مانند فریم فعلی یا مقدار بازگشتی. (مشارکت‌شده توسط Tian Gao در gh-103693.)

random

shutil

  • shutil.make_archive() اکنون آرگومان root_dir را به آرشیوکننده‌های سفارشی‌ای که از آن پشتیبانی می‌کنند، ارسال می‌کند. در این حالت، این تابع برای انجام آرشیو، دیگر پوشه‌ی کاری جاری فرایند را به‌طور موقت به root_dir تغییر نمی‌دهد. (مشارکت Serhiy Storchaka در gh-74696.)

  • shutil.rmtree() اکنون آرگومان جدید onexc را می‌پذیرد که هندلر خطایی مانند onerror است، اما به‌جای سه‌تایی (typ, val, tb) یک نمونه از استثنا را انتظار دارد. onerror منسوخ شده است. (مشارکت‌شده توسط ایریت کاتریل در gh-102828.)

  • shutil.which() اکنون در ویندوز، حتی وقتی cmd داده‌شده شامل جزء پوشه است، برای یافتن تطبیق‌ها درون PATH به متغیر محیطی PATHEXT مراجعه می‌کند. (مشارکت‌شده توسط Charles Machalow در gh-103179.)

    shutil.which() هنگام جستجوی پرونده‌های اجرایی در ویندوز، NeedCurrentDirectoryForExePathW را فراخوانی می‌کند تا تعیین کند که آیا پوشه‌ی کاری جاری باید به ابتدای مسیر جستجو افزوده شود یا خیر. (مشارکت‌شده توسط Charles Machalow در gh-103179.)

    در ویندوز، shutil.which() پیش از تطبیق مستقیم در جای دیگر از مسیر جستجو، مسیری مطابق با cmd به‌همراه جزئی از PATHEXT را برمی‌گرداند. (مشارکت‌شده توسط Charles Machalow در gh-103179.)

sqlite3

statistics

  • تابع statistics.correlation() گسترش یافت تا روش ranked را برای محاسبه‌ی همبستگی اسپیرمن داده‌های رتبه‌بندی‌شده در بر بگیرد. (با مشارکت Raymond Hettinger در gh-95861.)

sys

  • فضای نام sys.monitoring برای در دسترس قرار دادن API جدید پایش PEP 669 افزوده شد. (با مشارکت Mark Shannon در gh-103082.)

  • افزودن sys.activate_stack_trampoline() و sys.deactivate_stack_trampoline() برای فعال کردن و غیرفعال کردن ترامپولین‌های پروفایل‌گیر پشته، و sys.is_stack_trampoline_active() برای پرس‌وجو درباره‌ی فعال بودن ترامپولین‌های پروفایل‌گیر پشته. (مشارکت‌شده توسط Pablo Galindo و Christian Heimes همراه با مشارکت Gregory P. Smith [Google] و Mark Shannon در gh-96123.)

  • افزودن sys.last_exc که آخرین استثنای مدیریت‌نشده‌ی مطرح‌شده را نگه می‌دارد (برای موارد استفاده از اشکال‌زدایی پس از خاتمه). منسوخ کردن سه فیلدی که همان اطلاعات را به شکل قدیمی خود دارند: sys.last_type، sys.last_value و sys.last_traceback. (مشارکت‌شده توسط Irit Katriel در gh-102778.)

  • sys._current_exceptions() اکنون نگاشتی از شناسه‌ی نخ به نمونه‌ای از استثنا برمی‌گرداند، نه به تاپل (typ, exc, tb). (مشارکت Irit Katriel در gh-103176.)

  • sys.setrecursionlimit() و sys.getrecursionlimit(). حد بازگشتی اکنون فقط به کد پایتون اعمال می‌شود. توابع توکار از حد بازگشتی استفاده نمی‌کنند، اما توسط سازوکاری متفاوت محافظت می‌شوند که از فروپاشی ماشین مجازی در اثر بازگشتی جلوگیری می‌کند.

tempfile

  • تابع tempfile.NamedTemporaryFile دارای پارامتر اختیاری جدید delete_on_close است (مشارکت Evgeny Zorin در gh-58451.)

  • tempfile.mkdtemp() اکنون همیشه یک مسیر مطلق برمی‌گرداند، حتی اگر آرگومان ارائه‌شده به پارامتر dir یک مسیر نسبی باشد.

threading

tkinter

  • tkinter.Canvas.coords() اکنون آرگومان‌های خود را تخت‌سازی می‌کند. این متد اکنون نه‌تنها مختصات را به‌صورت آرگومان‌های جداگانه (x1, y1, x2, y2, ...) و به‌صورت دنباله‌ای از مختصات ([x1, y1, x2, y2, ...]) می‌پذیرد، بلکه مختصات گروه‌بندی‌شده به شکل جفت‌ها ((x1, y1), (x2, y2), ... و [(x1, y1), (x2, y2), ...]) را نیز می‌پذیرد، مانند متدهای create_*(). (مشارکت‌شده توسط Serhiy Storchaka در gh-94473.)

tokenize

  • ماژول tokenize شامل تغییرات معرفی‌شده در PEP 701 است. (مشارکت‌شده توسط Marta Gómez Macías و Pablo Galindo در gh-102856.) برای اطلاعات بیشتر درباره‌ی تغییرات ماژول tokenize، به انتقال به پایتون 3.12 مراجعه کنید.

types

typing

  • بررسی‌های isinstance() نسبت به پروتکل‌های بررسی‌پذیر در زمان اجرا اکنون برای یافتن اینکه آیا ویژگی‌ها وجود دارند یا خیر، به‌جای hasattr() از inspect.getattr_static() استفاده می‌کنند. این بدان معناست که توصیف‌گرها و متدهای __getattr__() دیگر به‌طور غیرمنتظره در طول بررسی‌های isinstance() نسبت به پروتکل‌های بررسی‌پذیر در زمان اجرا ارزیابی نمی‌شوند. با این حال، این ممکن است بدان معنا نیز باشد که برخی اشیایی که پیش‌تر نمونه‌هایی از یک پروتکل بررسی‌پذیر در زمان اجرا در نظر گرفته می‌شدند، در پایتون 3.12+ ممکن است دیگر نمونه‌هایی از آن پروتکل در نظر گرفته نشوند، و برعکس. بعید است که بیشتر کاربران تحت تأثیر این تغییر قرار بگیرند. (مشارکت‌شده توسط Alex Waygood در gh-102433.)

  • اعضای یک پروتکل بررسی‌پذیر در ران‌تایم، اکنون به محض اینکه کلاس ایجاد شود، در ران‌تایم «فریزشده» در نظر گرفته می‌شوند. مانکی‌پچ کردن ویژگی‌ها روی یک پروتکل بررسی‌پذیر در ران‌تایم همچنان کار خواهد کرد، اما هیچ تأثیری بر بررسی‌های isinstance() که اشیاء را با پروتکل مقایسه می‌کنند نخواهد داشت. برای مثال:

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
    True
    

    این تغییر به‌منظور سرعت بخشیدن به بررسی‌های isinstance() روی پروتکل‌های بررسی‌پذیر در زمان اجرا انجام شد.

  • پروفایل کارایی بررسی‌های isinstance() با پروتکل‌های قابل بررسی در زمان اجرا به‌طور قابل توجهی تغییر کرده است. بیشتر بررسی‌های isinstance() با پروتکل‌هایی که تنها چند عضو دارند، باید دست‌کم ۲ برابر سریع‌تر از 3.11 باشند و برخی ممکن است ۲۰ برابر سریع‌تر یا بیشتر باشند. با این حال، بررسی‌های isinstance() با پروتکل‌هایی که اعضای زیادی دارند، ممکن است نسبت به پایتون 3.11 کندتر باشند. (مشارکت‌شده توسط Alex Waygood در gh-74690 و gh-103193.)

  • تمام کلاس‌های typing.TypedDict و typing.NamedTuple اکنون دارای ویژگی __orig_bases__ هستند. (ارائه‌شده توسط آدریان گارسیا باداراکو در gh-103699.)

  • افزودن پارامتر frozen_default به @typing.dataclass_transform. (ارائه‌شده توسط Erik De Bonte در gh-99957.)

unicodedata

  • پایگاه داده یونیکد به نسخه‌ی 15.0.0 به‌روزرسانی شده است. (با مشارکت Benjamin Peterson در gh-96734).

unittest

افزودن گزینه‌ی خط فرمان --durations که N مورد از کندترین موارد آزمون را نشان می‌دهد:

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)

(مشارکت‌شده توسط Giampaolo Rodola در gh-48330)

uuid

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

  • اعضای wstr و wstr_length از اشیاء یونیکد حذف شدند. این کار اندازه شیء را در پلتفرم‌های ۶۴بیتی به میزان ۸ یا ۱۶ بایت کاهش می‌دهد. (PEP 623) (مشارکت‌شده توسط Inada Naoki در gh-92536.)

  • افزودن پشتیبانی آزمایشی برای استفاده از بهینه‌ساز دودویی BOLT در فرایند ساخت، که عملکرد را ۱ تا ۵ درصد بهبود می‌بخشد. (مشارکت‌شده توسط Kevin Modzelewski در gh-90536 و تنظیم‌شده توسط Donghee Na در gh-101525)

  • سرعت جایگزینی عبارت باقاعده (توابع re.sub() و re.subn() و متدهای متناظر re.Pattern) برای رشته‌های جایگزینی حاوی ارجاع به گروه‌ها، ۲ تا ۳ برابر افزایش یافت. (با مشارکت Serhiy Storchaka در gh-91524.)

  • ایجاد asyncio.Task با به تعویق انداختن قالب‌بندی پرهزینه رشته، سریع‌تر می‌شود. (مشارکت‌شده توسط ایتامار اورن در gh-103793.)

  • توابع tokenize.tokenize() و tokenize.generate_tokens() به‌عنوان یک اثر جانبی از تغییرات لازم برای پوشش PEP 701 در ماژول tokenize، تا ۶۴٪ سریع‌تر شده‌اند. (مشارکت‌شده توسط Marta Gómez Macías و Pablo Galindo در gh-102856.)

  • افزایش سرعت فراخوانی متدها و بارگذاری ویژگی‌ها در super() از طریق دستور جدید LOAD_SUPER_ATTR. (مشارکت‌شده توسط Carl Meyer و Vladimir Matveev در gh-103497.)

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

  • دستورالعمل LOAD_METHOD حذف شد. این دستورالعمل در LOAD_ATTR ادغام شده است. LOAD_ATTR اکنون اگر کم‌ارزش‌ترین بیت oparg آن تنظیم شده باشد، مانند دستورالعمل قدیمی LOAD_METHOD رفتار می‌کند. (با مشارکت Ken Jin در gh-93429.)

  • دستورهای JUMP_IF_FALSE_OR_POP و JUMP_IF_TRUE_OR_POP حذف شدند. (مشارکت‌شده توسط Irit Katriel در gh-102859.)

  • دستورالعمل PRECALL حذف شد. (مشارکت Mark Shannon در gh-92925.)

  • افزودن دستورهای BINARY_SLICE و STORE_SLICE. (مشارکت‌شده توسط Mark Shannon در gh-94163.)

  • افزودن دستورالعمل‌های CALL_INTRINSIC_1. (ارائه‌شده توسط Mark Shannon در gh-99005.)

  • دستور CALL_INTRINSIC_2 اضافه شد. (مشارکت‌شده توسط ایریت کاتریل در gh-101799.)

  • دستور CLEANUP_THROW اضافه شد. (مشارکت‌شده توسط Brandt Bucher در gh-90997.)

  • افزودن دستورالعمل END_SEND. (مشارکت‌شده توسط Mark Shannon در gh-103082.)

  • دستورالعمل LOAD_FAST_AND_CLEAR به‌عنوان بخشی از پیاده‌سازی PEP 709 افزوده شد. (مشارکت‌کرده توسط Carl Meyer در gh-101441.)

  • افزودن دستورالعمل LOAD_FAST_CHECK. (با مشارکت Dennis Sweeney در gh-93143.)

  • آپ‌کد‌های LOAD_FROM_DICT_OR_DEREF، LOAD_FROM_DICT_OR_GLOBALS و LOAD_LOCALS به‌عنوان بخشی از پیاده‌سازی PEP 695 افزوده شدند. آپ‌کد LOAD_CLASSDEREF که می‌توان آن را با LOAD_LOCALS به‌علاوه‌ی LOAD_FROM_DICT_OR_DEREF جایگزین کرد، حذف شد. (با مشارکت Jelle Zijlstra در gh-103764.)

  • دستورالعمل LOAD_SUPER_ATTR افزوده شد. (مشارکت‌شده توسط کارل مایر و ولادیمیر ماتویف در gh-103497.)

  • دستور RETURN_CONST اضافه شد. (با مشارکت Wenyang Wang در gh-101632.)

دموها و ابزارها

  • پوشه‌ی Tools/demo/ که شامل اسکریپت‌های نمایشی قدیمی بود، حذف شد. نسخه‌ای از آن را می‌توان در پروژه‌ی old-demos یافت. (مشارکت‌شده توسط Victor Stinner در gh-97681.)

  • اسکریپت‌های نمونه‌ی قدیمی از پوشه‌ی Tools/scripts/ حذف شدند. نسخه‌ای از آن‌ها را می‌توانید در پروژه‌ی old-demos بیابید. (مشارکت‌شده توسط Victor Stinner در gh-97669.)

منسوخ

  • argparse: پارامترهای type، choices و metavar در argparse.BooleanOptionalAction منسوخ شده‌اند و در نسخه‌ی 3.14 حذف خواهند شد. (مشارکت Nikita Sobolev در gh-92248.)

  • ast: قابلیت‌های زیر ماژول ast از پایتون 3.8 در مستندات منسوخ اعلام شده بودند، اکنون هنگام دسترسی یا استفاده از آن‌ها در ران‌تایم موجب صدور DeprecationWarning می‌شوند و در پایتون 3.14 حذف خواهند شد:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    به‌جای آن از ast.Constant استفاده کنید. (مشارکت‌شده توسط Serhiy Storchaka در gh-90953.)

  • asyncio:

    • کلاس‌های پایشگر فرزند (child watcher) asyncio.MultiLoopChildWatcher، asyncio.FastChildWatcher، asyncio.AbstractChildWatcher و asyncio.SafeChildWatcher منسوخ شده‌اند و در پایتون 3.14 حذف خواهند شد. (با مشارکت Kumar Aditya در gh-94597.)

    • asyncio.set_child_watcher()، asyncio.get_child_watcher()، asyncio.AbstractEventLoopPolicy.set_child_watcher() و asyncio.AbstractEventLoopPolicy.get_child_watcher() منسوخ شده‌اند و در پایتون 3.14 حذف خواهند شد. (مشارکت‌شده توسط Kumar Aditya در gh-94597.)

    • متد get_event_loop() سیاست حلقه رویداد پیش‌فرض اکنون در صورتی که هیچ حلقه رویداد جاری‌ای تنظیم‌نشده باشد و تصمیم بگیرد یکی ایجاد کند، هشدار DeprecationWarning منتشر می‌کند. (مشارکت Serhiy Storchaka و Guido van Rossum در gh-100160.)

  • calendar: ثابت‌های calendar.January و calendar.February منسوخ شده‌اند و با calendar.JANUARY و calendar.FEBRUARY جایگزین شده‌اند. (مشارکت‌شده توسط Prince Roshan در gh-103636.)

  • collections.abc: collections.abc.ByteString منسوخ شده است.

    برای آزمودن اینکه آیا obj پروتکل بافر را در ران‌تایم پیاده‌سازی می‌کند، از isinstance(obj, collections.abc.Buffer) استفاده کنید. برای استفاده در حاشیه‌نویسی نوع، یا از Buffer استفاده کنید یا از یک اجتماع (union) که صریحاً نوع‌هایی را که کد شما از آن‌ها پشتیبانی می‌کند مشخص می‌کند (مثلاً bytes | bytearray | memoryview).

    ByteString در ابتدا قرار بود یک کلاس انتزاعی باشد که به‌عنوان ابری‌نوع (supertype) هر دو bytes و bytearray عمل کند. اما از آنجا که این کلاس پایه انتزاعی هرگز هیچ متدی نداشت، دانستن اینکه یک شیء نمونه‌ای از ByteString است، در واقع هرگز چیز مفیدی درباره‌ی آن شیء به شما نمی‌گفت. سایر نوع‌های رایج بافر مانند memoryview نیز هرگز به‌عنوان زیرنوع‌هایی از ByteString در نظر گرفته نمی‌شدند (چه در زمان اجرا و چه توسط بررسی‌گرهای نوع ایستا).

    برای جزئیات بیشتر به PEP 688 مراجعه کنید. (مشارکت‌شده توسط شانتانو جین در gh-91896.)

  • datetime: متدهای utcnow() و utcfromtimestamp() از کلاس datetime.datetime منسوخ شده‌اند و در یک نسخه‌ی آینده حذف خواهند شد. به جای آن، برای نمایش تاریخ‌ها و زمان‌ها در UTC از شیءهای آگاه از منطقه‌ی زمانی استفاده کنید: به ترتیب، now() و fromtimestamp() را با پارامتر tz تنظیم‌شده روی datetime.UTC فراخوانی کنید. (مشارکت‌شده توسط Paul Ganssle در gh-103857.)

  • email: منسوخ کردن پارامتر isdst در email.utils.localtime(). (نوشته‌شده توسط آلن ویلیامز در gh-72346.)

  • importlib.abc: کلاس‌های زیر منسوخ شدند و قرار است در پایتون 3.14 حذف شوند:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    به‌جای آن از کلاس‌های importlib.resources.abc استفاده کنید:

    (مشارکت‌شده توسط Jason R. Coombs و Hugo van Kemenade در gh-93963.)

  • itertools: پشتیبانی از عملیات‌های copy، deepcopy و pickle — که مستندنشده، نا‌کارآمد، از دیرباز دارای اشکال و ناسازگار است — منسوخ شد. این پشتیبانی در نسخه 3.14 برای کاهش چشمگیر حجم کد و بار نگهداری حذف خواهد شد. (مشارکت‌شده توسط Raymond Hettinger در gh-101588.)

  • multiprocessing: در پایتون 3.14، روش آغاز پیش‌فرض multiprocessing در لینوکس، BSDها و سایر پلتفرم‌های POSIX غیر از macOS که 'fork' در حال حاضر در آن‌ها پیش‌فرض است، به روشی امن‌تر تغییر خواهد کرد (gh-84559). افزودن هشدار زمان اجرا درباره‌ی این موضوع بیش از حد مخل تلقی شد، زیرا انتظار نمی‌رود اکثر کدها به آن اهمیت دهند. از API‌های get_context() یا set_start_method() استفاده کنید تا در مواردی که کد شما به 'fork' نیاز دارد، آن را صریحاً مشخص کنید. به زمینه‌ها و روش‌های آغاز مراجعه کنید.

  • pkgutil: pkgutil.find_loader() و pkgutil.get_loader() منسوخ شده‌اند و در پایتون 3.14 حذف خواهند شد؛ به جای آن‌ها از importlib.util.find_spec() استفاده کنید. (مشارکت‌شده توسط نیکیتا سوبولف در gh-97850.)

  • pty: این ماژول دارای دو تابع مستندنشده‌ی master_open() و slave_open() است که از پایتون ۲ منسوخ شده‌اند، اما فقط در 3.12 یک DeprecationWarning مناسب دریافت کردند. آن‌ها را در 3.14 حذف کنید. (ارائه‌شده توسط Soumendra Ganguly و Gregory P. Smith در gh-85984.)

  • os:

    • فیلد‌های st_ctime که توسط os.stat() و os.lstat() در ویندوز برگردانده می‌شوند، منسوخ شده‌اند. در نسخه‌ای آینده، این فیلد‌ها زمان آخرین تغییر فراداده را در بر خواهند داشت که با سایر پلتفرم‌ها هماهنگ است. در حال حاضر، این فیلد‌ها همچنان زمان ایجاد را در بر دارند که در فیلد جدید st_birthtime نیز در دسترس است. (مشارکت‌شده توسط Steve Dower در gh-99726.)

    • در پلتفرم‌های POSIX، تابع os.fork() اکنون می‌تواند هنگامی که بتواند تشخیص دهد که از یک فرایند چندنخی فراخوانی شده است، یک DeprecationWarning ایجاد کند. همیشه هنگام انجام این کار، ناسازگاری بنیادی با پلتفرم POSIX وجود داشته است. حتی اگر چنین کدی به‌ظاهر کار می‌کرد. ما این هشدار را برای افزایش آگاهی اضافه کردیم، زیرا مشکلاتی که کدهای انجام‌دهنده‌ی این کار با آن‌ها روبه‌رو می‌شوند رو به افزایش هستند. برای جزئیات بیشتر به مستندات os.fork() مراجعه کنید و همچنین این بحث درباره‌ی ناسازگاری فورک با نخ‌ها را ببینید تا بدانید چرا اکنون این مشکل دیرینه‌ی سازگاری پلتفرم را برای توسعه‌دهندگان آشکار می‌کنیم.

    هنگامی که این هشدار به دلیل استفاده از multiprocessing یا concurrent.futures ظاهر می‌شود، راه‌حل این است که از روش آغاز (start method) متفاوتی مانند "spawn" یا "forkserver" در multiprocessing استفاده کنید.

  • shutil: آرگومان onerror در shutil.rmtree() منسوخ شده است؛ به‌جای آن از onexc استفاده کنید. (مشارکت‌شده توسط Irit Katriel در gh-102828.)

  • sqlite3:

  • sys: فیلدهای sys.last_type، sys.last_value و sys.last_traceback منسوخ شده‌اند. به جای آن‌ها از sys.last_exc استفاده کنید. (مشارکت‌شده توسط Irit Katriel در gh-102778.)

  • tarfile: استخراج آرشیو‌های tar بدون مشخص کردن filter تا Python 3.14 منسوخ است؛ در آن زمان فیلتر 'data' پیش‌فرض خواهد شد. برای جزئیات به فیلترهای استخراج مراجعه کنید.

  • typing:

  • xml.etree.ElementTree: این ماژول اکنون هنگام آزمودن مقدار درستیِ یک xml.etree.ElementTree.Element، DeprecationWarning منتشر می‌کند. پیش از این، پیاده‌سازی پایتون FutureWarning منتشر می‌کرد و پیاده‌سازی C چیزی منتشر نمی‌کرد. (مشارکت‌کرده توسط Jacob Walls در gh-83122.)

  • امضاهای سه‌آرگومانی (type، value، traceback) در هم‌روال throw()، تولیدگر throw() و تولیدگر ناهمگام throw() منسوخ شده‌اند و ممکن است در نسخه‌ای آینده از پایتون حذف شوند. به‌جای آن از نسخه‌های تک‌آرگومانی این توابع استفاده کنید. (با مشارکت Ofey Chan در gh-89874.)

  • اکنون وقتی __package__ روی یک ماژول با __spec__.parent متفاوت باشد، DeprecationWarning برخاسته می‌شود (پیش‌تر ImportWarning بود). (مشارکت توسط Brett Cannon در gh-65961.)

  • تنظیم __package__ یا __cached__ روی یک ماژول منسوخ شده است و در پایتون 3.14 سیستم ایمپورت دیگر آن‌ها را تنظیم نخواهد کرد یا در نظر نخواهد گرفت. (مشارکت‌شده توسط Brett Cannon در gh-65961.)

  • عملگر وارون‌سازی بیتی (~) روی bool منسوخ شده است. این عملگر در Python 3.16 خطا پرتاب خواهد کرد. به‌جای آن، از not برای نقیه منطقی مقادیر بولی استفاده کنید. در حالت نادر که واقعاً به وارون‌سازی بیتی int زیرین نیاز دارید، آن را صریحاً به int تبدیل کنید: ~int(x). (مشارکت‌شده توسط Tim Hoffmann در gh-103487.)

  • دسترسی به co_lnotab روی اشیاء کد در پایتون 3.10 از طریق PEP 626 منسوخ شد، اما تنها در نسخه 3.12 بود که یک DeprecationWarning مناسب دریافت کرد. ممکن است در نسخه 3.15 حذف شود. (مشارکت نیکیتا سوبولف در gh-101866.)

در پایتون 3.13 حذف خواهد شد

ماژول‌ها (نگاه کنید به PEP 594):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

ماژول‌های دیگر:

  • lib2to3 و برنامه‌ی 2to3 (gh-84540)

API‌ها:

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

  • argparse: پارامترهای type، choices و metavar در argparse.BooleanOptionalAction منسوخ شده‌اند و در نسخه‌ی 3.14 حذف خواهند شد. (مشارکت Nikita Sobolev در gh-92248.)

  • ast: ویژگی‌های زیر از زمان پایتون 3.8 در مستندات منسوخ اعلام شده‌اند، اکنون هنگامی که به آن‌ها دسترسی پیدا شود یا از آن‌ها استفاده شود، در زمان اجرا موجب صدور DeprecationWarning می‌شوند و در پایتون 3.14 حذف خواهند شد:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    به‌جای آن از ast.Constant استفاده کنید. (مشارکت‌شده توسط Serhiy Storchaka در gh-90953.)

  • asyncio:

    • کلاس‌های پایشگر فرزند (child watcher) asyncio.MultiLoopChildWatcher، asyncio.FastChildWatcher، asyncio.AbstractChildWatcher و asyncio.SafeChildWatcher منسوخ شده‌اند و در پایتون 3.14 حذف خواهند شد. (با مشارکت Kumar Aditya در gh-94597.)

    • asyncio.set_child_watcher()، asyncio.get_child_watcher()، asyncio.AbstractEventLoopPolicy.set_child_watcher() و asyncio.AbstractEventLoopPolicy.get_child_watcher() منسوخ شده‌اند و در پایتون 3.14 حذف خواهند شد. (مشارکت‌شده توسط Kumar Aditya در gh-94597.)

    • متد get_event_loop() سیاست حلقه رویداد پیش‌فرض اکنون در صورتی که هیچ حلقه رویداد جاری‌ای تنظیم‌نشده باشد و تصمیم بگیرد یکی ایجاد کند، هشدار DeprecationWarning منتشر می‌کند. (مشارکت Serhiy Storchaka و Guido van Rossum در gh-100160.)

  • email: پارامتر isdst در email.utils.localtime() منسوخ شد. (مشارکت‌شده توسط Alan Williams در gh-72346.)

  • importlib.abc کلاس‌های منسوخ:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    به‌جای آن از کلاس‌های importlib.resources.abc استفاده کنید:

    (مشارکت‌شده توسط Jason R. Coombs و Hugo van Kemenade در gh-93963.)

  • ماژول itertools پشتیبانی مستند‌نشده، ناکارآمد، دارای سابقه‌ی اشکال و ناسازگار از عملیات کپی، کپی عمیق و پیکل داشت. این پشتیبانی در نسخه‌ی 3.14 برای کاهش چشمگیر حجم کد و بار نگهداری حذف خواهد شد. (مشارکت‌شده توسط Raymond Hettinger در gh-101588.)

  • multiprocessing: روش آغاز پیش‌فرض در لینوکس، BSD‌ها و سایر پلتفرم‌های POSIX غیر از macOS که در حال حاضر 'fork' پیش‌فرض آن‌هاست، به روشی امن‌تر تغییر خواهد کرد (gh-84559). افزودن هشدار زمان اجرا درباره‌ی این موضوع بیش از حد مخل تلقی شد، زیرا انتظار نمی‌رود اکثر کدها به آن اهمیت بدهند. از API‌های get_context() یا set_start_method() استفاده کنید تا به‌صراحت مشخص کنید که چه زمانی کد شما نیازمند 'fork' است. به زمینه‌ها و متدهای شروع مراجعه کنید.

  • pathlib: is_relative_to() و relative_to(): گذاشتن آرگومان‌های اضافی منسوخ شده است.

  • pkgutil: pkgutil.find_loader() و pkgutil.get_loader() اکنون DeprecationWarning را مطرح می‌کنند؛ به‌جای آن از importlib.util.find_spec() استفاده کنید. (مشارکت‌شده توسط نیکیتا سوبولف در gh-97850.)

  • pty:

  • sqlite3:

  • urllib: urllib.parse.Quoter منسوخ شده است: قرار نبود که این کلاس یک API عمومی باشد. (مشارکت‌شده توسط Gregory P. Smith در gh-88168.)

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

  • سیستم ایمپورت:

    • تنظیم __cached__ روی یک ماژول بدون آنکه __spec__.cached تنظیم شود، منسوخ شده است. در پایتون 3.15، __cached__ دیگر توسط سیستم ایمپورت یا کتابخانه استاندارد تنظیم یا در نظر گرفته نخواهد شد. (gh-97879)

    • تنظیم __package__ روی یک ماژول بدون تنظیم __spec__.parent منسوخ شده است. در پایتون 3.15، __package__ دیگر توسط سامانه ایمپورت یا کتابخانه استاندارد تنظیم یا در نظر گرفته نخواهد شد. (gh-97879)

  • ctypes:

    • تابع مستندسازی‌نشده‌ی ctypes.SetPointerType() از پایتون 3.13 منسوخ شده است.

  • http.server:

    • کلاس CGIHTTPRequestHandler که منسوخ است و به‌ندرت استفاده می‌شود، از پایتون 3.13 از رده خارج شده است. هیچ جایگزین مستقیمی وجود ندارد. برای اتصال یک وب‌سرور به هندلر درخواست، هر چیزی بهتر از CGI است.

    • پرچم --cgi در رابط خط فرمان python -m http.server از پایتون 3.13 منسوخ شده است.

  • importlib:

    • متد load_module(): به‌جای آن از exec_module() استفاده کنید.

  • pathlib:

  • platform:

    • java_ver() از پایتون 3.13 منسوخ شده است. این تابع تنها برای پشتیبانی از Jython مفید است، API گیج‌کننده‌ای دارد و عمدتاً آزمون‌نشده است.

  • sysconfig:

  • threading:

    • RLock() در پایتون 3.15 هیچ آرگومانی نخواهد گرفت. ارسال هر آرگومانی از پایتون 3.14 منسوخ شده است، زیرا پیاده‌سازی پایتونی هیچ آرگومانی را مجاز نمی‌داند، اما پیاده‌سازی C هر تعداد آرگومان جایگاهی یا کلیدواژه‌ای را می‌پذیرد و همه آرگومان‌ها را نادیده می‌گیرد.

  • types:

    • types.CodeType: دسترسی به co_lnotab مطابق PEP 626 از نسخه‌ی 3.10 منسوخ شد و قرار بود در 3.12 حذف شود، اما تنها در 3.12 یک DeprecationWarning مناسب دریافت کرد. ممکن است در 3.15 حذف شود. (مشارکت‌شده توسط Nikita Sobolev در gh-101866.)

  • typing:

    • سینتکس مستند‌نشده‌ی آرگومان کلیدواژه‌ای برای ایجاد کلاس‌های NamedTuple (برای مثال، Point = NamedTuple("Point", x=int, y=int)) از پایتون 3.13 منسوخ شده است. به جای آن از سینتکس مبتنی بر کلاس یا سینتکس تابعی استفاده کنید.

    • هنگام استفاده از سینتکس تابعی TypedDicts، ارسال‌نکردن مقدار به پارامتر fields (TD = TypedDict("TD")) یا ارسال None (TD = TypedDict("TD", None)) از پایتون 3.13 منسوخ شده است. برای ایجاد یک TypedDict بدون هیچ فیلدی، از class TD(TypedDict): pass یا TD = TypedDict("TD", {}) استفاده کنید.

    • تابع دکوراتور @typing.no_type_check_decorator از پایتون 3.13 منسوخ شده است. پس از هشت سال حضور در ماژول typing، هنوز هیچ بررسی‌گر نوع (type checker) بزرگی از آن پشتیبانی نکرده است.

  • wave:

  • zipimport:

    • load_module() از پایتون 3.10 منسوخ شده است. به جای آن از exec_module() استفاده کنید. (مشارکت‌شده توسط Jiahao Li در gh-125746.)

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

  • سیستم ایمپورت:

    • تنظیم __loader__ روی یک ماژول بدون تنظیم __spec__.loader منسوخ شده است. در پایتون 3.16، __loader__ دیگر توسط سیستم ایمپورت یا کتابخانه استاندارد تنظیم نخواهد شد و مورد توجه قرار نخواهد گرفت.

  • array:

    • کد قالب 'u' (wchar_t) از پایتون 3.3 در مستندات و از پایتون 3.13 در ران‌تایم منسوخ شده است. به جای آن، از کد قالب 'w' (Py_UCS4) برای نویسه‌های یونیکد استفاده کنید.

  • asyncio:

  • builtins:

    • وارون‌سازی بیتی روی نوع‌های بولی، ~True یا ~False، از پایتون 3.12 منسوخ شده است، زیرا نتایج تعجب‌آور و خلاف شهود تولید می‌کند (-2 و -1). برای نقیض منطقی یک مقدار بولی، به‌جای آن از not x استفاده کنید. در موارد نادر که به وارون‌سازی بیتی عدد صحیح زیرین نیاز دارید، آن را به‌طور صریح به int تبدیل کنید (~int(x)).

  • functools:

    • فراخوانی پیاده‌سازی پایتونِ functools.reduce() با function یا sequence به‌عنوان آرگومان‌های کلیدواژه‌ای، از پایتون 3.14 منسوخ شده است.

  • logging:

    پشتیبانی از هندلرهای گزارش‌گیری سفارشی با آرگومان strm منسوخ شده و برای حذف در پایتون 3.16 برنامه‌ریزی شده است. به جای آن، هندلرها را با آرگومان stream تعریف کنید. (مشارکت‌شده توسط Mariusz Felisiak در gh-115032.)

  • mimetypes:

    • پسوندهای معتبر برای mimetypes.MimeTypes.add_type() با '.' شروع می‌شوند یا خالی هستند. پسوندهای بدون نقطه منسوخ شده‌اند و در پایتون 3.16 یک ValueError ایجاد خواهند کرد. (با مشارکت هوگو ون کمِناده در gh-75223.)

  • shutil:

    • استثنای ExecError از پایتون 3.14 منسوخ شده است. این استثنا از پایتون 3.4 به بعد توسط هیچ تابعی در shutil استفاده نشده است و اکنون مستعاری برای RuntimeError است.

  • symtable:

  • sys:

  • sysconfig:

    • تابع sysconfig.expand_makefile_vars() از پایتون 3.14 منسوخ شده است. به جای آن، از آرگومان vars تابع sysconfig.get_paths() استفاده کنید.

  • tarfile:

    • ویژگی مستندنشده و استفاده‌نشده‌ی TarFile.tarfile از پایتون 3.13 منسوخ شده است.

در انتظار حذف در Python 3.17

  • collections.abc:

    • collections.abc.ByteString برای حذف در پایتون 3.17 برنامه‌ریزی شده است.

      برای آزمودن اینکه آیا obj پروتکل بافر را در ران‌تایم پیاده‌سازی می‌کند، از isinstance(obj, collections.abc.Buffer) استفاده کنید. برای استفاده در حاشیه‌نویسی نوع، یا از Buffer استفاده کنید یا از یک اجتماع (union) که صریحاً نوع‌هایی را که کد شما از آن‌ها پشتیبانی می‌کند مشخص می‌کند (مثلاً bytes | bytearray | memoryview).

      ByteString در ابتدا قرار بود یک کلاس انتزاعی باشد که به‌عنوان ابری‌نوع (supertype) هر دو bytes و bytearray عمل کند. اما از آنجا که این کلاس پایه انتزاعی هرگز هیچ متدی نداشت، دانستن اینکه یک شیء نمونه‌ای از ByteString است، در واقع هرگز چیز مفیدی درباره‌ی آن شیء به شما نمی‌گفت. سایر نوع‌های رایج بافر مانند memoryview نیز هرگز به‌عنوان زیرنوع‌هایی از ByteString در نظر گرفته نمی‌شدند (چه در زمان اجرا و چه توسط بررسی‌گرهای نوع ایستا).

      برای جزئیات بیشتر به PEP 688 مراجعه کنید. (مشارکت‌شده توسط شانتانو جین در gh-91896.)

  • typing:

    • پیش از پایتون 3.14، اجتماع‌های سبک قدیمی (old-style unions) با استفاده از کلاس خصوصی typing._UnionGenericAlias پیاده‌سازی می‌شدند. این کلاس دیگر برای پیاده‌سازی مورد نیاز نیست، اما برای سازگاری با نسخه‌های قبلی حفظ شده است و حذف آن برای پایتون 3.17 برنامه‌ریزی شده است. کاربران باید به‌جای اتکا به جزئیات پیاده‌سازی خصوصی، از ابزارهای کمکی مستند‌شده‌ی درون‌نگری مانند typing.get_origin() و typing.get_args() استفاده کنند.

    • typing.ByteString، که از پایتون 3.9 منسوخ شده است، قرار است در پایتون 3.17 حذف شود.

      برای آزمودن اینکه آیا obj پروتکل بافر را در ران‌تایم پیاده‌سازی می‌کند، از isinstance(obj, collections.abc.Buffer) استفاده کنید. برای استفاده در حاشیه‌نویسی نوع، یا از Buffer استفاده کنید یا از یک اجتماع (union) که صریحاً نوع‌هایی را که کد شما از آن‌ها پشتیبانی می‌کند مشخص می‌کند (مثلاً bytes | bytearray | memoryview).

      ByteString در ابتدا قرار بود یک کلاس انتزاعی باشد که به‌عنوان ابری‌نوع (supertype) هر دو bytes و bytearray عمل کند. اما از آنجا که این کلاس پایه انتزاعی هرگز هیچ متدی نداشت، دانستن اینکه یک شیء نمونه‌ای از ByteString است، در واقع هرگز چیز مفیدی درباره‌ی آن شیء به شما نمی‌گفت. سایر نوع‌های رایج بافر مانند memoryview نیز هرگز به‌عنوان زیرنوع‌هایی از ByteString در نظر گرفته نمی‌شدند (چه در زمان اجرا و چه توسط بررسی‌گرهای نوع ایستا).

      برای جزئیات بیشتر به PEP 688 مراجعه کنید. (مشارکت‌شده توسط شانتانو جین در gh-91896.)

در انتظار حذف در نسخه‌های آینده

APIهای زیر در آینده حذف خواهند شد، هرچند در حال حاضر تاریخی برای حذف آن‌ها تعیین نشده است.

  • argparse:

    • تودرتو کردن گروه‌های آرگومان و تودرتو کردن گروه‌های انحصاری متقابل منسوخ شده‌اند.

    • ارسال آرگومان کلیدواژه‌ای مستند‌نشده prefix_chars به add_argument_group() اکنون منسوخ شده است.

    • مبدل نوع argparse.FileType منسوخ شده است.

  • builtins:

    • تولیدگرها: امضای throw(type, exc, tb) و athrow(type, exc, tb) منسوخ شده است: به جای آن از throw(exc) و athrow(exc) استفاده کنید، یعنی امضای تک‌آرگومانی.

    • در حال حاضر پایتون مقادیر لفظی عددی را می‌پذیرد که بلافاصله کلیدواژه‌ای پس از آن‌ها بیاید؛ برای مثال 0in x، 1or x و 0if 1else 2. این امر اجازه می‌دهد عبارت‌های سردرگم‌کننده و مبهمی مانند [0x1for x in y] نوشته شوند (که می‌توان آن را به‌صورت [0x1 for x in y] یا [0x1f or x in y] تفسیر کرد). اگر بلافاصله پس از مقدار لفظی عددی، یکی از کلیدواژه‌های and، else، for، if، in، is و or بیاید، یک هشدار سینتکس نشان داده می‌شود. در یک نسخه‌ی آینده این مورد به یک خطای سینتکس تبدیل خواهد شد. (gh-87999)

    • پشتیبانی از متدهای __index__() و __int__() که نوعی غیر از int برمی‌گردانند: این متدها ملزم خواهند شد که نمونه‌ای از یک زیرکلاس اکید از int را برگردانند.

    • پشتیبانی از متد __float__() که زیرکلاس اکیدی از float را بازگرداند: این متدها ملزم خواهند شد که نمونه‌ای از float را بازگردانند.

    • پشتیبانی از متد __complex__() که زیرکلاس محضی از complex را برمی‌گرداند: این متدها ملزم خواهند شد که نمونه‌ای از complex را بازگردانند.

    • گذراندن یک عدد مختلط به‌عنوان آرگومان real یا imag در سازنده‌ی complex() اکنون منسوخ شده است؛ این عدد باید فقط به‌عنوان یک آرگومان جایگاهی منفرد گذرانده شود. (مشارکت Serhiy Storchaka در gh-109218.)

  • calendar: ثابت‌های calendar.January و calendar.February منسوخ شده‌اند و با calendar.JANUARY و calendar.FEBRUARY جایگزین شده‌اند. (مشارکت‌شده توسط Prince Roshan در gh-103636.)

  • codecs: به جای codecs.open() از open() استفاده کنید. (gh-133038)

  • codeobject.co_lnotab: به جای آن از متد codeobject.co_lines() استفاده کنید.

  • datetime:

    • utcnow(): از datetime.datetime.now(tz=datetime.UTC) استفاده کنید.

    • utcfromtimestamp(): از datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC) استفاده کنید.

  • gettext: مقدار صیغه جمع باید یک عدد صحیح باشد.

  • importlib:

    • پارامتر debug_override در cache_from_source() منسوخ شده است: به جای آن از پارامتر optimization استفاده کنید.

  • importlib.metadata:

    • رابط تاپل EntryPoints.

    • None ضمنی در مقادیر بازگشتی.

  • logging: متد warn() از پایتون 3.3 منسوخ شده است؛ به‌جای آن از warning() استفاده کنید.

  • mailbox: استفاده از ورودی StringIO و حالت متنی منسوخ شده است؛ به جای آن از BytesIO و حالت دودویی استفاده کنید.

  • os: فراخوانی os.register_at_fork() در فرایند چندنخی.

  • pydoc.ErrorDuringImport: مقدار تاپل برای پارامتر exc_info منسوخ شده است؛ از یک نمونه استثنا استفاده کنید.

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

  • ماژول‌های sre_compile، sre_constants و sre_parse.

  • shutil: پارامتر onerror در rmtree() در پایتون 3.12 منسوخ شده است؛ به جای آن از پارامتر onexc استفاده کنید.

  • گزینه‌ها و پروتکل‌های ssl:

    • ssl.SSLContext بدون آرگومان پروتکل منسوخ شده است.

    • ssl.SSLContext: set_npn_protocols() و selected_npn_protocol() منسوخ شده‌اند: به‌جای آن‌ها از ALPN استفاده کنید.

    • گزینه‌های ssl.OP_NO_SSL*

    • گزینه‌های ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • متدهای threading:

  • typing.Text (gh-92332).

  • کلاس داخلی typing._UnionGenericAlias دیگر برای پیاده‌سازی typing.Union استفاده نمی‌شود. برای حفظ سازگاری با کاربرانی که از این کلاس خصوصی استفاده می‌کنند، یک لایه سازگاری (shim) تا دست‌کم پایتون 3.17 ارائه خواهد شد. (مشارکت‌شده توسط Jelle Zijlstra در gh-105499.)

  • unittest.IsolatedAsyncioTestCase: برگرداندن مقداری غیر از None از یک مورد آزمون، منسوخ شده است.

  • توابع منسوخ urllib.parse: به‌جای آن‌ها از urlparse() استفاده کنید

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • wsgiref: SimpleHandler.stdout.write() نباید نوشتن جزئی انجام دهد.

  • xml.etree.ElementTree: آزمودن مقدار درستی یک Element منسوخ شده است. در یک نسخه‌ی آینده همیشه True برگردانده خواهد شد. به‌جای آن، آزمون‌های صریح len(elem) یا elem is not None را ترجیح دهید.

  • sys._clear_type_cache() منسوخ شده است: به جای آن از sys._clear_internal_caches() استفاده کنید.

حذف‌شده

asynchat و asyncore

  • این دو ماژول مطابق با زمان‌بندی تعیین‌شده در PEP 594 حذف شده‌اند؛ این ماژول‌ها در پایتون 3.6 منسوخ شده بودند. به جای آن‌ها از asyncio استفاده کنید. (مشارکت نیکیتا سوبولف در gh-96580.)

configparser

  • چندین نام که در configparser از همان نسخه 3.2 منسوخ شده بودند، طبق gh-89336 حذف شده‌اند:

    • configparser.ParsingError دیگر ویژگی یا آرگومان filename ندارد. به‌جای آن، از ویژگی و آرگومان source استفاده کنید.

    • configparser دیگر کلاس SafeConfigParser ندارد. به جای آن از نام کوتاه‌تر ConfigParser استفاده کنید.

    • configparser.ConfigParser دیگر متد readfp را ندارد. به جای آن از read_file() استفاده کنید.

distutils

  • بسته‌ی distutils حذف شد. این بسته در پایتون 3.10 بر اساس PEP 632 «منسوخ‌سازی ماژول distutils» منسوخ شده بود. برای پروژه‌هایی که هنوز از distutils استفاده می‌کنند و نمی‌توان آن‌ها را به چیز دیگری به‌روزرسانی کرد، می‌توان پروژه‌ی setuptools را نصب کرد: این پروژه همچنان distutils را فراهم می‌کند. (مشارکت‌شده توسط Victor Stinner در gh-92584.)

ensurepip

  • حذف ویل (wheel) همراه setuptools از ensurepip، و توقف نصب setuptools در محیط‌هایی که توسط venv ایجاد می‌شوند.

    pip (>= 22.1) نیازی به نصب setuptools در محیط ندارد. بسته‌های مبتنی بر setuptools (و مبتنی بر distutils) همچنان با pip install قابل استفاده هستند، زیرا pip setuptools را در محیط ساخت مورد استفاده برای ساخت یک بسته فراهم می‌کند.

    easy_install، pkg_resources، setuptools و distutils دیگر به‌صورت پیش‌فرض در محیط‌هایی که با venv ایجاد شده‌اند یا با ensurepip بوت‌استرپ شده‌اند ارائه نمی‌شوند، زیرا آن‌ها بخشی از بسته‌ی setuptools هستند. برای پروژه‌هایی که در ران‌تایم به این موارد تکیه می‌کنند، پروژه‌ی setuptools باید به‌عنوان یک وابستگی اعلام شود و به‌صورت جداگانه (معمولاً با استفاده از pip) نصب شود.

    (با مشارکت Pradyun Gedam در gh-95299.)

enum

  • متد EnumMeta.__getattr__ از ماژول enum حذف شد؛ این متد دیگر برای دسترسی به ویژگی‌های enum لازم نیست. (مشارکت‌شده توسط Ethan Furman در gh-95083.)

ftplib

  • ویژگی کلاس FTP_TLS.ssl_version از ftplib حذف شد: به جای آن از پارامتر context استفاده کنید. (مشارکت‌شده توسط Victor Stinner در gh-94172.)

gzip

  • ویژگی filename از کلاس gzip.GzipFile در ماژول gzip که از پایتون 2.6 منسوخ شده بود، حذف شد؛ به‌جای آن از ویژگی name استفاده کنید. در حالت نوشتن، ویژگی filename پسوند پرونده‌ی '.gz' را در صورت نبودن اضافه می‌کرد. (مشارکت‌شده توسط Victor Stinner در gh-94196.)

hashlib

  • پیاده‌سازی خالص پایتونِ hashlib.pbkdf2_hmac() در hashlib، که در پایتون 3.10 منسوخ شده بود، حذف شد. پایتون 3.10 و جدیدتر به OpenSSL 1.1.1 نیاز دارد (PEP 644): این نسخه از OpenSSL یک پیاده‌سازی C برای pbkdf2_hmac() فراهم می‌کند که سریع‌تر است. (مشارکت Victor Stinner در gh-94199.)

importlib

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

    • ارجاع‌ها به module_repr() و پشتیبانی از آن حذف شده‌اند. (مشارکت‌شده توسط Barry Warsaw در gh-97850.)

    • importlib.util.set_package، importlib.util.set_loader و importlib.util.module_for_loader همگی حذف شده‌اند. (مشارکت‌شده توسط Brett Cannon و Nikita Sobolev در gh-65961 و gh-97850.)

    • پشتیبانی از APIهای find_loader() و find_module() حذف شده است. (مشارکت‌شده توسط Barry Warsaw در gh-98040.)

    • importlib.abc.Finder، pkgutil.ImpImporter و pkgutil.ImpLoader حذف شده‌اند. (مشارکت‌شده توسط Barry Warsaw در gh-98040.)

imp

  • ماژول imp حذف شده است. (مشارکت‌شده توسط Barry Warsaw در gh-98040.)

    برای مهاجرت، به جدول تناظر زیر مراجعه کنید:

    imp

    importlib

    imp.NullImporter

    None را در sys.path_importer_cache درج کنید

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES، importlib.machinery.EXTENSION_SUFFIXES و importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    به ادامه مراجعه کنید

    imp.load_source() را با این جایگزین کنید:

    import importlib.util
    import importlib.machinery
    
    def load_source(modname, filename):
        loader = importlib.machinery.SourceFileLoader(modname, filename)
        spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
        module = importlib.util.module_from_spec(spec)
        # The module is always executed and not cached in sys.modules.
        # Uncomment the following line to cache the module.
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • حذف توابع و ویژگی‌های imp بدون جایگزین:

    • توابع بدون مستندات:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held()، imp.acquire_lock()، imp.release_lock(): طرح‌واره‌ی قفل‌بندی در پایتون 3.3 به قفل‌های به‌ازای هر ماژول تغییر کرده است.

    • ثابت‌های imp.find_module(): SEARCH_ERROR، PY_SOURCE، PY_COMPILED، C_EXTENSION، PY_RESOURCE، PKG_DIRECTORY، C_BUILTIN، PY_FROZEN، PY_CODERESOURCE، IMP_HOOK.

io

  • io.OpenWrapper و _pyio.OpenWrapper از io که در Python 3.10 منسوخ شده بودند، حذف شدند: به‌جای آن‌ها فقط از open() استفاده کنید. تابع open() (io.open()) یک تابع توکار است. از Python 3.10 به بعد، _pyio.open() نیز یک متد ایستا است. (مشارکت‌شده توسط Victor Stinner در gh-94169.)

locale

  • تابع locale.format() ماژول locale که در پایتون 3.7 منسوخ شده بود، حذف شد؛ به‌جای آن از locale.format_string() استفاده کنید. (مشارکت‌شده توسط Victor Stinner در gh-94226.)

smtpd

  • ماژول smtpd که در پایتون 3.4.7 و 3.5.4 منسوخ شده بود، مطابق با زمان‌بندی تعیین‌شده در PEP 594 حذف شده است. به جای آن از ماژول aiosmtpd در PyPI یا هر سرور مبتنی بر asyncio دیگری استفاده کنید. (با مشارکت Oleg Iarygin در gh-93243.)

sqlite3

  • ویژگی‌های مستندنشده‌ی sqlite3 زیر که در پایتون 3.10 منسوخ شده بودند، اکنون حذف شده‌اند:

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    اگر باید از نهانگاه اشتراکی استفاده شود، پایگاه داده را در حالت URI با استفاده از پارامتر پرس‌وجوی cache=shared باز کنید.

    کارخانه‌ی متن (text factory) sqlite3.OptimizedUnicode از پایتون 3.3 به بعد مستعاری برای str بوده است. کدی که پیش‌تر کارخانه‌ی متن را روی OptimizedUnicode تنظیم می‌کرد، می‌تواند یا به‌طور صریح از str استفاده کند، یا بر مقدار پیش‌فرض تکیه کند که آن هم str است.

    (مشارکت‌شده توسط Erlend E. Aasland در gh-92548.)

ssl

  • تابع ssl.RAND_pseudo_bytes() ماژول ssl که در پایتون 3.6 منسوخ شده بود، حذف شد؛ به‌جای آن از os.urandom() یا ssl.RAND_bytes() استفاده کنید. (مشارکت‌شده توسط Victor Stinner در gh-94199.)

  • تابع ssl.match_hostname() حذف شد. این تابع در پایتون 3.7 منسوخ شده بود. از پایتون 3.7، OpenSSL تطبیق نام میزبان را انجام می‌دهد و پایتون دیگر از تابع ssl.match_hostname() استفاده نمی‌کند. (مشارکت‌شده توسط ویکتور استینر در gh-94199.)

  • تابع ssl.wrap_socket() که در Python 3.7 منسوخ شده بود، حذف شد: به‌جای آن، یک شیء ssl.SSLContext ایجاد کنید و متد ssl.SSLContext.wrap_socket آن را فراخوانی کنید. هر بسته‌ای که هنوز از ssl.wrap_socket() استفاده می‌کند، خراب و نا‌امن است. این تابع نه افزونه SNI در TLS را ارسال می‌کند و نه نام میزبان سرور را اعتبارسنجی می‌کند. کد مشمول CWE 295 (اعتبارسنجی نادرست گواهی) است. (مشارکت‌شده توسط Victor Stinner در gh-94199.)

unittest

webbrowser

  • پشتیبانی از مرورگرهای منسوخ از webbrowser حذف شد. مرورگرهای حذف‌شده عبارت‌اند از: Grail، Mosaic، Netscape، Galeon، Skipstone، Iceape، Firebird و نسخه‌های 35 و پایین‌تر Firefox (gh-102871).

xml.etree.ElementTree

  • متد ElementTree.Element.copy() از پیاده‌سازی خالص پایتون، که در پایتون 3.10 منسوخ شده بود، حذف شد؛ به‌جای آن از تابع copy.copy() استفاده کنید. پیاده‌سازی C از xml.etree.ElementTree متد copy() ندارد و فقط متد __copy__() دارد. (مشارکت‌شده توسط Victor Stinner در gh-94383.)

zipimport

  • متدهای find_loader() و find_module() ماژول zipimport که در پایتون 3.10 منسوخ شده بودند، حذف شدند؛ به‌جای آن‌ها از متد find_spec() استفاده کنید. برای توضیح دلایل این تغییر به PEP 451 مراجعه کنید. (نوشته‌شده توسط Victor Stinner در gh-94379.)

موارد دیگر

  • قاعده‌ی suspicious از Makefile مستندات و Doc/tools/rstlint.py حذف شد، هر دو به نفع sphinx-lint. (مشارکت‌شده توسط Julien Palard در gh-98179.)

  • پارامترهای keyfile و certfile از ماژول‌های ftplib، imaplib، poplib و smtplib و همچنین پارامترهای key_file، cert_file و check_hostname از ماژول http.client حذف شدند که همگی از پایتون 3.6 منسوخ شده بودند. به‌جای آن‌ها از پارامتر context (ssl_context در imaplib) استفاده کنید. (مشارکت‌کننده: Victor Stinner در gh-94172.)

  • هک‌های سازگاری Jython از چندین ماژول و آزمون کتابخانه استاندارد حذف شدند. (مشارکت‌شده توسط نیکیتا سوبولف در gh-99482.)

  • حذف پرچم _use_broken_old_ctypes_structure_semantics_ از ماژول ctypes. (مشارکت‌شده توسط Nikita Sobolev در gh-99285.)

انتقال به پایتون 3.12

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

تغییرات در API پایتون

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

  • قابلیت randrange() که از پایتون 3.10 منسوخ شده بود، حذف شد. پیش‌تر، randrange(10.0) بدون اتلاف به randrange(10) تبدیل می‌شد. اکنون، استثنای TypeError ایجاد می‌شود. علاوه بر این، استثنایی که برای مقادیر غیرصحیح مانند randrange(10.5) یا randrange('10') ایجاد می‌شد، از ValueError به TypeError تغییر کرده است. این تغییر همچنین از اشکالاتی جلوگیری می‌کند که در آن‌ها randrange(1e25) به‌صورت بی‌صدا از بازه‌ای بزرگ‌تر از بازه‌ی randrange(10**25) انتخاب می‌کرد. (در ابتدا توسط Serhiy Storchaka پیشنهاد شد gh-86388.)

  • argparse.ArgumentParser هنگام خواندن آرگومان‌ها از پرونده (مثلاً گزینه‌ی fromfile_prefix_chars)، کدگذاری و هندلر خطا را از کدگذاری متن پیش‌فرض (مثلاً locale.getpreferredencoding(False)) به filesystem encoding and error handler تغییر داد. در ویندوز، پرونده‌های آرگومان باید به‌جای کدپیج ANSI با UTF-8 کدگذاری شوند.

  • ماژول smtpd مبتنی بر asyncore که در پایتون 3.4.7 و 3.5.4 منسوخ شده بود، حذف شد. جایگزین توصیه‌شده، ماژول aiosmtpd مبتنی بر asyncio در PyPI است.

  • shlex.split(): ارسال None برای آرگومان s اکنون به‌جای خواندن sys.stdin، استثنا ایجاد می‌کند. این قابلیت در Python 3.9 منسوخ شده بود. (مشارکت‌شده توسط Victor Stinner در gh-94352.)

  • ماژول os دیگر مسیرهای شبه‌بایت مانند نوع‌های bytearray و memoryview را نمی‌پذیرد: برای رشته‌های بایتی، فقط نوع دقیق bytes پذیرفته می‌شود. (مشارکت Victor Stinner در gh-98393.)

  • syslog.openlog() و syslog.closelog() اکنون در صورت استفاده در زیرمفسرها شکست می‌خورند. از syslog.syslog() هنوز هم می‌توان در زیرمفسرها استفاده کرد، اما اکنون تنها در صورتی که syslog.openlog() پیش‌تر در مفسر اصلی فراخوانی شده باشد. این محدودیت‌های جدید بر مفسر اصلی اعمال نمی‌شوند، بنابراین تنها گروه بسیار کوچکی از کاربران ممکن است تحت تأثیر قرار گیرند. این تغییر به جداسازی مفسر کمک می‌کند. علاوه بر این، syslog پوششی حول منابع سراسری در سطح فرایند است که بهتر است از مفسر اصلی مدیریت شوند. (مشارکت‌شده توسط Donghee Na در gh-99127.)

  • رفتار قفل‌گذاری مستندنشده‌ی @~functools.cached_property حذف شده است، زیرا قفل آن میان همه‌ی نمونه‌های کلاس مشترک بود و به رقابت شدید بر سر قفل (lock contention) منجر می‌شد. این بدان معناست که تابع getter یک پراپرتی نهانگاهی، اکنون ممکن است برای یک نمونه‌ی واحد بیش از یک بار اجرا شود، اگر دو نخ با هم رقابت کنند. برای اکثر پراپرتی‌های نهانگاهی ساده (مثلاً پراپرتی‌هایی که هم‌توان هستند و صرفاً مقداری را بر اساس ویژگی‌های دیگر نمونه محاسبه می‌کنند) این مشکلی نخواهد داشت. اگر همگام‌سازی لازم باشد، قفل‌گذاری را درون تابع getter پراپرتی نهانگاهی یا در اطراف نقاط دسترسی چندنخی پیاده‌سازی کنید.

  • sys._current_exceptions() اکنون نگاشتی از شناسه‌ی نخ به نمونه‌ای از استثنا برمی‌گرداند، نه به تاپل (typ, exc, tb). (مشارکت Irit Katriel در gh-103176.)

  • هنگام استخراج پرونده‌های tar با استفاده از tarfile یا shutil.unpack_archive()، آرگومان filter را برای محدود کردن قابلیت‌هایی که ممکن است غافلگیرکننده یا خطرناک باشند ارسال کنید. برای جزئیات به فیلترهای استخراج مراجعه کنید.

  • خروجی توابع tokenize.tokenize() و tokenize.generate_tokens() اکنون به دلیل تغییرات معرفی‌شده در PEP 701 تغییر کرده است. این بدان معناست که توکن‌های STRING دیگر برای اف‌استرینگ‌ها تولید نمی‌شوند و در عوض، توکن‌های توصیف‌شده در PEP 701 اکنون تولید می‌شوند: توکن‌های FSTRING_START، FSTRING_MIDDLE و FSTRING_END اکنون برای بخش‌های «رشته‌ای» اف‌استرینگ، در کنار توکن‌های مناسب برای توکن‌سازی در اجزای عبارت، تولید می‌شوند. برای مثال، نسخه‌ی قدیمی توکن‌ساز برای اف‌استرینگ f"start {1+1} end" این توکن‌ها را تولید می‌کرد:

    1,0-1,18:           STRING         'f"start {1+1} end"'
    

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

    1,0-1,2:            FSTRING_START  'f"'
    1,2-1,8:            FSTRING_MIDDLE 'start '
    1,8-1,9:            OP             '{'
    1,9-1,10:           NUMBER         '1'
    1,10-1,11:          OP             '+'
    1,11-1,12:          NUMBER         '1'
    1,12-1,13:          OP             '}'
    1,13-1,17:          FSTRING_MIDDLE ' end'
    1,17-1,18:          FSTRING_END    '"'
    

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

    • ویژگی type توکن‌هایی که هنگام توکن‌سازی برخی نویسه‌های نامعتبر پایتون مانند ! تولید می‌شوند، از ERRORTOKEN به OP تغییر کرده است.

    • رشته‌های تک‌سطری ناقص نیز اکنون مانند رشته‌های چندسطری ناقص، استثنای tokenize.TokenError را ایجاد می‌کنند.

    • برخی از کدهای ناقص یا نامعتبر پایتون اکنون هنگام توکن‌سازی، به‌جای بازگرداندن توکن‌های ERRORTOKEN دلخواه، tokenize.TokenError ایجاد می‌کنند.

    • ترکیب تب و فاصله به‌عنوان تورفتگی در یک پرونده دیگر پشتیبانی نمی‌شود و استثنای TabError ایجاد می‌کند.

  • ماژول threading اکنون انتظار دارد که ماژول _thread دارای ویژگی _is_main_interpreter باشد. این تابعی بدون آرگومان است که اگر مفسر فعلی، مفسر اصلی باشد، True برمی‌گرداند.

    هر کتابخانه یا برنامه‌ای که ماژول _thread سفارشی ارائه می‌دهد، باید _is_main_interpreter() را نیز فراهم کند. (نگاه کنید به gh-112826.)

تغییرات ساخت

  • پایتون دیگر از setup.py برای ساخت ماژول‌های توسعه‌ای مشترک C استفاده نمی‌کند. پارامترهای ساخت مانند سرآیندها و کتابخانه‌ها در اسکریپت configure تشخیص داده می‌شوند. ماژول‌های توسعه‌ای توسط Makefile ساخته می‌شوند. اغلب ماژول‌های توسعه‌ای از pkg-config استفاده می‌کنند و به تشخیص دستی بازمی‌گردند. (مشارکت Christian Heimes در gh-93939.)

  • va_start() با دو پارامتر، مانند va_start(args, format), اکنون برای ساخت پایتون لازم است. va_start() دیگر با یک پارامتر فراخوانی نمی‌شود. (مشارکت Kumar Aditya در gh-93207.)

  • سی‌پایتون اکنون در صورتی که کامپایلر Clang این پرچم را بپذیرد، از گزینه‌ی ThinLTO به‌عنوان سیاست پیش‌فرض بهینه‌سازی زمان پیوند استفاده می‌کند. (مشارکت‌شده توسط Donghee Na در gh-89536.)

  • متغیر COMPILEALL_OPTS به Makefile اضافه شد تا گزینه‌های compileall (پیش‌فرض: -j0) در make install بازنویسی شوند. همچنین ۳ دستور compileall در یک دستور واحد ادغام شدند تا پرونده‌های .pyc برای همه‌ی سطوح بهینه‌سازی (0, 1, 2) یک‌جا ساخته شوند. (مشارکت‌شده توسط Victor Stinner در gh-99289.)

  • افزودن سه‌تایی‌های سکو (platform triplets) برای LoongArch ۶۴-بیتی:

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (مشارکت‌شده توسط Zhang Na در gh-90656.)

  • PYTHON_FOR_REGEN اکنون به پایتون 3.10 یا جدیدتر نیاز دارد.

  • اکنون برای بازتولید configure به Autoconf 2.71 و aclocal 1.16.4 نیاز است. (مشارکت‌شده توسط Christian Heimes در gh-89886.)

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

تغییرات C API

قابلیت‌های جدید

  • PEP 697: معرفی سطح ناپایدار API زبان C که برای ابزارهای سطح پایین مانند اشکال‌زدا‌ها و کامپایلرهای JIT در نظر گرفته‌شده است. این API ممکن است در هر نسخه‌ی فرعی سی‌پایتون بدون هشدارهای منسوخ‌سازی تغییر کند. محتویات آن با پیشوند PyUnstable_ در نام‌ها مشخص می‌شوند.

    سازنده‌های شیء کد:

    • PyUnstable_Code_New() (تغییرنام‌یافته از PyCode_New)

    • PyUnstable_Code_NewWithPosOnlyArgs() (تغییرنام‌یافته از PyCode_NewWithPosOnlyArgs)

    فضای ذخیره‌سازی اضافی برای شیءهای کد (PEP 523):

    • PyUnstable_Eval_RequestCodeExtraIndex() (تغییرنام‌یافته از _PyEval_RequestCodeExtraIndex)

    • PyUnstable_Code_GetExtra() (تغییرنام‌یافته از _PyCode_GetExtra)

    • PyUnstable_Code_SetExtra() (که از _PyCode_SetExtra تغییر نام یافته است)

    نام‌های اصلی تا زمانی که API مربوطه تغییر کند، همچنان در دسترس خواهند بود.

    (مشارکت Petr Viktorin در gh-101101.)

  • PEP 697: افزودن یک API برای توسعه دادن نوع‌هایی که چیدمان حافظه‌ی نمونه‌هایشان مات است:

    (مشارکت‌شده توسط پتر ویکتورین در gh-103509.)

  • تابع جدید C API محدود PyType_FromMetaclass() اضافه شد که تابع موجود PyType_FromModuleAndSpec() را با استفاده از یک آرگومان فراکلاس اضافی تعمیم می‌دهد. (با مشارکت Wenzel Jakob در gh-93012.)

  • API برای ایجاد اشیایی که می‌توان با استفاده از پروتکل vectorcall آن‌ها را فراخوانی کرد، به API محدود اضافه شد:

    اکنون هنگامی که متد __call__() کلاس دوباره انتساب داده می‌شود، پرچم Py_TPFLAGS_HAVE_VECTORCALL از کلاس حذف می‌شود. این کار استفاده از vectorcall را با نوع‌های تغییرپذیر ایمن می‌سازد (یعنی نوع‌های هیپ بدون پرچم تغییرناپذیری، Py_TPFLAGS_IMMUTABLETYPE). نوع‌های تغییرپذیری که tp_call را بازنویسی نمی‌کنند، اکنون پرچم Py_TPFLAGS_HAVE_VECTORCALL را به ارث می‌برند. (مشارکت‌شده توسط Petr Viktorin در gh-93274.)

    پرچم‌های Py_TPFLAGS_MANAGED_DICT و Py_TPFLAGS_MANAGED_WEAKREF افزوده شده‌اند. این امر به کلاس‌های توسعه‌ای امکان می‌دهد تا با دفترداری کمتر، مصرف حافظه کمتر و دسترسی سریع‌تر، از __dict__ شیء و ارجاع‌های ضعیف پشتیبانی کنند.

  • API برای انجام فراخوانی‌ها با استفاده از پروتکل vectorcall به API محدود اضافه شد:

    این بدان معناست که هر دو سمت ورودی و خروجی پروتکل فراخوانی برداری (vector call) اکنون در API محدود در دسترس هستند. (با مشارکت Wenzel Jakob در gh-98586.)

  • دو تابع عمومی جدید، PyEval_SetProfileAllThreads() و PyEval_SetTraceAllThreads()، اضافه شدند که اجازه می‌دهند توابع ردگیری و پروفایل‌گیری در همه‌ی نخ‌های در حال اجرا، علاوه بر نخ فراخواننده، تنظیم شوند. (مشارکت‌شده توسط Pablo Galindo در gh-93503.)

  • افزودن تابع جدید PyFunction_SetVectorcall() به API زبان C که فیلد vectorcall یک PyFunctionObject داده‌شده را تنظیم می‌کند. (مشارکت‌شده توسط Andrew Frost در gh-92257.)

  • API زبان C اکنون اجازه می‌دهد تا از طریق PyDict_AddWatcher()، PyDict_Watch() و API‌های مرتبط، کال‌بک‌هایی ثبت شوند که هرگاه یک دیکشنری تغییر داده شود، فراخوانی می‌شوند. این قابلیت برای استفاده توسط مفسرهای بهینه‌ساز، کامپایلرهای JIT یا اشکال‌زداها در نظر گرفته شده است. (مشارکت‌شده توسط کارل مایر در gh-91052.)

  • افزودن API‌های PyType_AddWatcher() و PyType_Watch() برای ثبت کردن کال‌بک‌ها به‌منظور دریافت اطلاع‌رسانی هنگام تغییر یک نوع. (مشارکت‌شده توسط کارل مایر در gh-91051.)

  • افزودن API‌های PyCode_AddWatcher() و PyCode_ClearWatcher() برای ثبت کال‌بک‌هایی که هنگام ایجاد و نابودی اشیاء کد اطلاع‌رسانی دریافت می‌کنند. (با مشارکت Itamar Oren در gh-91054.)

  • افزودن توابع PyFrame_GetVar() و PyFrame_GetVarString() برای گرفتن متغیر فریم بر اساس نام آن. (مشارکت‌شده توسط Victor Stinner در gh-91248.)

  • توابع PyErr_GetRaisedException() و PyErr_SetRaisedException() برای ذخیره و بازیابی استثنای فعلی اضافه شدند. این توابع به‌جای سه آرگومان توابع اکنون منسوخ‌شده‌ی PyErr_Fetch() و PyErr_Restore()، تنها یک شیء استثنا را برمی‌گردانند و می‌پذیرند. این کار کمتر مستعد خطا و کمی کارآمدتر است. (مشارکت Mark Shannon در gh-101578.)

  • _PyErr_ChainExceptions1 که یک نمونه‌ی استثنا دریافت می‌کند اضافه شد تا جایگزین _PyErr_ChainExceptions در API قدیمی شود که اکنون منسوخ شده است. (مشارکت Mark Shannon در gh-101578.)

  • توابع PyException_GetArgs() و PyException_SetArgs() به‌عنوان توابعی راحت برای بازیابی و تغییر args که به سازنده‌ی استثنا پاس داده می‌شود، اضافه شدند. (مشارکت Mark Shannon در gh-101578.)

  • افزودن PyErr_DisplayException() که یک نمونه استثنا می‌گیرد، برای جایگزینی PyErr_Display() مربوط به API قدیمی. (مشارکت از طرف ایریت کاتریل در gh-102755).

  • PEP 683: معرفی اشیاء نامیرا، که به اشیاء اجازه می‌دهد شمارش ارجاع را دور بزنند، و تغییرات مرتبط با C-API:

    • _Py_IMMORTAL_REFCNT: شمارش ارجاعی که یک شیء را تعریف می‌کند

      به‌عنوان نامیرا.

    • _Py_IsImmortal بررسی می‌کند که آیا یک شیء دارای شمارش ارجاع نامیرا است یا خیر.

    • PyObject_HEAD_INIT اکنون شمارش ارجاع را مقداردهی اولیه می‌کند به

      _Py_IMMORTAL_REFCNT هنگامی که همراه با Py_BUILD_CORE استفاده شود.

    • SSTATE_INTERNED_IMMORTAL شناسه‌ای برای اشیاء یونیکد درونی‌سازی‌شده

      که نامیرا هستند.

    • SSTATE_INTERNED_IMMORTAL_STATIC شناسه‌ای برای یونیکد درونی‌سازی‌شده

      اشیایی که نامیرا و ایستا هستند

    • sys.getunicodeinternedsize این تعداد کل یونیکد را برمی‌گرداند

      اشیایی که درون‌سازی (intern) شده‌اند. این امر اکنون لازم است تا refleak.py بتواند شمارش ارجاع و بلوک‌های تخصیص‌یافته را به‌درستی پیگیری کند

    (مشارکت‌شده توسط Eddie Elizondo در gh-84436.)

  • PEP 684: افزودن تابع جدید Py_NewInterpreterFromConfig() و PyInterpreterConfig که می‌توان از آن‌ها برای ایجاد زیرمفسرهایی با قفل‌های مفسر سراسری اختصاصی خودشان استفاده کرد. (برای اطلاعات بیشتر به PEP 684: قفل مفسر سراسری به ازای هر مفسر مراجعه کنید.) (مشارکت‌شده توسط Eric Snow در gh-104110.)

  • در نسخه‌ی 3.12 از C API محدود، توابع Py_INCREF() و Py_DECREF() اکنون به‌صورت فراخوانی‌های تابع مات پیاده‌سازی شده‌اند تا جزئیات پیاده‌سازی را پنهان کنند. (مشارکت‌شده توسط Victor Stinner در gh-105387.)

انتقال به پایتون 3.12

  • API‌های قدیمی یونیکد مبتنی بر نمایش Py_UNICODE* حذف شده‌اند. لطفاً به API‌های مبتنی بر UTF-8 یا wchar_t* مهاجرت کنید.

  • توابع تجزیه‌ی آرگومان مانند PyArg_ParseTuple() دیگر از قالب‌های مبتنی بر Py_UNICODE* (مانند u و Z) پشتیبانی نمی‌کنند. لطفاً به قالب‌های دیگر یونیکد مانند s، z، es و U مهاجرت کنید.

  • مقدار tp_weaklist برای همه‌ی نوع‌های توکار ایستا همیشه NULL است. این یک فیلد صرفاً داخلی در PyTypeObject است، اما به این تغییر اشاره می‌کنیم چرا که ممکن است کسی به هر حال مستقیماً به این فیلد دسترسی داشته باشد. برای جلوگیری از خرابی، به جای آن استفاده از C-API عمومی موجود را در نظر بگیرید، یا در صورت نیاز، از ماکرو (صرفاً داخلی) _PyObject_GET_WEAKREFS_LISTPTR() استفاده کنید.

  • این PyTypeObject.tp_subclasses که صرفاً داخلی است، ممکن است اکنون اشاره‌گر شیء معتبری نباشد. نوع آن برای بازتاب این موضوع به void* تغییر یافت. این را برای حالتی ذکر می‌کنیم که کسی اتفاقاً مستقیماً به این فیلد صرفاً داخلی دسترسی داشته باشد.

    برای به‌دست‌آوردن فهرستی از زیرکلاس‌ها، متد پایتونی __subclasses__() را فراخوانی کنید (برای مثال با استفاده از PyObject_CallMethod()).

  • افزودن پشتیبانی از گزینه‌های قالب‌بندی بیشتر (چپ‌چین کردن، مبنای هشت، مبنای شانزده با حروف بزرگ، رشته‌های C از نوع intmax_t، ptrdiff_t و wchar_t، عرض و دقت متغیر) در PyUnicode_FromFormat() و PyUnicode_FromFormatV(). (مشارکت Serhiy Storchaka در gh-98836.)

  • نویسه قالب ناشناخته در PyUnicode_FromFormat() و PyUnicode_FromFormatV() اکنون یک SystemError برپا می‌کند. در نسخه‌های قبلی، این نویسه باعث می‌شد تمام باقی‌مانده‌ی رشته قالب عیناً به رشته نتیجه کپی شود و هر آرگومان اضافی دور ریخته شود. (مشارکت‌شده توسط Serhiy Storchaka در gh-95781.)

  • اصلاح جایگذاری نادرست علامت در PyUnicode_FromFormat() و PyUnicode_FromFormatV(). (ارائه‌شده توسط Philip Georgi در gh-95504.)

  • کلاس‌های توسعه‌ای که می‌خواهند جایگاه __dict__ یا ارجاع ضعیف اضافه کنند، باید به‌ترتیب به‌جای tp_dictoffset و tp_weaklistoffset از Py_TPFLAGS_MANAGED_DICT و Py_TPFLAGS_MANAGED_WEAKREF استفاده کنند. استفاده از tp_dictoffset و tp_weaklistoffset همچنان پشتیبانی می‌شود، اما از وراثت چندگانه به‌طور کامل پشتیبانی نمی‌کند (gh-95589) و ممکن است کارایی بدتر باشد. کلاس‌هایی که Py_TPFLAGS_MANAGED_DICT را اعلام می‌کنند، باید برای پیمایش و پاک‌سازی دیکشنری‌های نمونه‌های خود، _PyObject_VisitManagedDict() و _PyObject_ClearManagedDict() را فراخوانی کنند. برای پاک‌سازی ارجاع‌های ضعیف، مانند قبل PyObject_ClearWeakRefs() را فراخوانی کنید.

  • تابع PyUnicode_FSDecoder() دیگر مسیرهای شبه‌بایت مانند نوع‌های bytearray و memoryview را نمی‌پذیرد: برای رشته‌های بایتی، فقط نوع دقیق bytes پذیرفته می‌شود. (مشارکت‌شده توسط Victor Stinner در gh-98393.)

  • ماکروهای Py_CLEAR، Py_SETREF و Py_XSETREF اکنون آرگومان‌های خود را فقط یک بار ارزیابی می‌کنند. اگر آرگومانی اثر جانبی داشته باشد، این اثرهای جانبی دیگر تکرار نمی‌شوند. (مشارکت‌شده توسط ویکتور استینر در gh-98724.)

  • نشانگر خطای مفسر اکنون همیشه نرمال‌سازی می‌شود. این بدان معناست که PyErr_SetObject()، PyErr_SetString() و سایر توابعی که نشانگر خطا را تنظیم می‌کنند، اکنون استثنا را پیش از ذخیره کردن آن نرمال‌سازی می‌کنند. (مشارکت‌شده توسط Mark Shannon در gh-101578.)

  • _Py_RefTotal دیگر معتبر نیست و تنها برای سازگاری با ABI حفظ شده است. توجه داشته باشید که این یک متغیر سراسری داخلی است و تنها در نسخه‌های دیباگ در دسترس است. اگر اتفاقاً از آن استفاده می‌کنید، باید استفاده از _Py_GetGlobalRefTotal() را آغاز کنید.

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

    ایجاد کلاس‌هایی که فراکلاس آن‌ها tp_new را بازنویسی می‌کند، منسوخ شده است و در پایتون 3.14+ این کار غیرمجاز خواهد بود. توجه داشته باشید که این توابع tp_new فراکلاس را نادیده می‌گیرند، که ممکن است منجر به مقداردهی اولیه ناقص شود.

    توجه داشته باشید که PyType_FromMetaclass() (که در Python 3.12 اضافه‌شده است) از پیش ایجاد کلاس‌هایی را که فراکلاس آن‌ها tp_new را بازنویسی می‌کند، ممنوع کرده است (__new__() در پایتون).

    از آنجا که tp_new تقریباً همه‌ی کارهایی را که توابع PyType_From* انجام می‌دهند بازنویسی می‌کند، این دو با یکدیگر ناسازگارند. رفتار موجود -- نادیده گرفتن فراکلاس در چند مرحله از ایجاد نوع -- به‌طور کلی ناامن است، زیرا (فرا)کلاس‌ها فرض می‌کنند که tp_new فراخوانی شده است. هیچ راه‌حل جایگزین عمومی ساده‌ای وجود ندارد. ممکن است یکی از موارد زیر برای شما کار کند:

    • اگر فراکلاس در کنترل شماست، از استفاده از tp_new در آن پرهیز کنید:

      • اگر بتوان از مقداردهی اولیه صرف‌نظر کرد، می‌توان آن را در عوض در tp_init انجام داد.

      • اگر فراکلاس نیازی به نمونه‌سازی از پایتون ندارد، tp_new آن را با استفاده از پرچم Py_TPFLAGS_DISALLOW_INSTANTIATION برابر NULL قرار دهید. این کار آن را برای توابع PyType_From* قابل قبول می‌کند.

    • از توابع PyType_From* پرهیز کنید: اگر به ویژگی‌های مختص C (جایگاه‌ها یا تعیین اندازه نمونه) نیاز ندارید، نوع‌ها را با فراخوانی فراکلاس ایجاد کنید.

    • اگر می‌دانید که می‌توان با اطمینان از tp_new صرف‌نظر کرد، هشدار منسوخ‌شدگی را با استفاده از warnings.catch_warnings() پایتون فیلتر کنید.

  • PyOS_InputHook و PyOS_ReadlineFunctionPointer دیگر در زیرمفسرها فراخوانی نمی‌شوند. دلیل این امر آن است که کلاینت‌ها به‌طور کلی به وضعیت سراسری در سطح فرایند متکی هستند (از آنجا که این کال‌بک‌ها هیچ راهی برای بازیابی وضعیت ماژول توسعه‌ای ندارند).

    این کار همچنین از موقعیت‌هایی جلوگیری می‌کند که در آن‌ها ممکن است ماژول‌های توسعه‌ای در یک زیرمفسر اجرا شوند که از آن پشتیبانی نمی‌کنند (یا هنوز در آن بارگذاری نشده‌اند). برای اطلاعات بیشتر به gh-104668 مراجعه کنید.

  • ساختار داخلی PyLongObject برای بهبود عملکرد تغییر کرده است. اگرچه ساختار داخلی PyLongObject خصوصی است، توسط برخی ماژول‌های توسعه‌ای استفاده می‌شود. دیگر نباید به فیلدهای داخلی به‌طور مستقیم دسترسی داشت؛ در عوض، باید از توابع API که با PyLong_... شروع می‌شوند استفاده کرد. دو تابع API جدید ناپایدار برای دسترسی کارآمد به مقدارهای PyLongObject که در یک واژه‌ی ماشین جای می‌گیرند، ارائه شده‌اند:

  • تخصیص‌دهنده‌های سفارشی که از طریق PyMem_SetAllocator() تنظیم می‌شوند، اکنون باید صرف‌نظر از دامنه حافظه، نخ‌ایمن باشند. تخصیص‌دهنده‌هایی که وضعیت مخصوص خود را ندارند، از جمله «قلاب‌ها»، تحت تأثیر قرار نمی‌گیرند. اگر تخصیص‌دهنده سفارشی شما از قبل نخ‌ایمن نیست و به راهنمایی نیاز دارید، لطفاً یک issue جدید در GitHub ایجاد کنید و @ericsnowcurrently را در CC قرار دهید.

منسوخ

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

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

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

  • نسخه‌ی همراه libmpdec.

در انتظار حذف در نسخه‌های آینده

API‌های زیر منسوخ شده‌اند و حذف خواهند شد، هرچند در حال حاضر هیچ تاریخی برای حذف آن‌ها تعیین نشده است.

حذف‌شده

  • حذف پرونده‌ی سرآیند token.h. هرگز هیچ API عمومی C برای توکن‌ساز وجود نداشت. پرونده‌ی سرآیند token.h فقط برای استفاده‌ی درونی‌های پایتون طراحی‌شده بود. (مشارکت‌شده توسط Victor Stinner در gh-92651.)

  • APIهای قدیمی یونیکد حذف شده‌اند. برای جزئیات به PEP 623 مراجعه کنید.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • ماکروی تابع PyUnicode_InternImmortal() حذف شد. (مشارکت‌شده توسط Victor Stinner در gh-85858.)