GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing python.github.io — تازههای پایتون 3.12 تازههای پایتون 3.12¶
این مقاله قابلیتهای جدید پایتون 3.12 را در مقایسه با 3.11 توضیح میدهد. پایتون 3.12 در تاریخ ۲ اکتبر ۲۰۲۳ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید. همچنین ببینید PEP 693 -- زمانبندی انتشار Python 3.12 خلاصه -- نکات برجسته انتشار¶پایتون 3.12 یک نسخه پایدار از زبان برنامهنویسی پایتون است که ترکیبی از تغییرات در زبان و کتابخانه استاندارد را در بر میگیرد. تغییرات کتابخانه بر پاکسازی APIهای منسوخ، کاربردپذیری و درستی متمرکز هستند. شایان ذکر است که بسته تغییرات زبان بر کاربردپذیری تمرکز دارند، زیرا بسیاری از محدودیتهای افاسترینگها برداشته شدهاند و پیشنهادهای «آیا منظورتان ... بود؟» همچنان بهبود مییابند. سینتکس جدید پارامتر نوع و دستور این مقاله تلاش نمیکند مشخصات کامل همهی ویژگیهای جدید را ارائه دهد، بلکه در عوض مروری مناسب ارائه میکند. برای جزئیات کامل، باید به مستنداتی مانند مرجع کتابخانه و مرجع زبان مراجعه کنید. اگر میخواهید پیادهسازی کامل و منطق طراحی یک تغییر را درک کنید، به PEP (پیشنهاد بهبود پایتون) مربوط به ویژگی جدید مورد نظر مراجعه کنید؛ اما توجه داشته باشید که PEPها معمولاً پس از پیادهسازی کامل یک ویژگی، بهروز نگه داشته نمیشوند. ویژگیهای جدید سینتکس: قابلیتهای جدید دستور زبان:
بهبودهای مفسر:
بهبودهای مدل داده پایتون:
بهبودهای قابلتوجه در کتابخانه استاندارد:
بهبودهای امنیتی:
بهبودهای C API: بهبودهای پیادهسازی سیپایتون:
ویژگیهای جدید تایپینگ:
منسوخشدگیها، حذفها یا محدودیتهای مهم:
قابلیتهای جدید¶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 Point = tuple[float, float] مستعارهای نوع همچنین میتوانند عام باشند: type Point[T] = tuple[T, T] سینتکس جدید امکان تعریف پارامترهای 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 برخی از محدودیتهای استفاده از افاسترینگها را برمیدارد. اجزای عبارت درون افاسترینگها اکنون میتوانند هر عبارت معتبر پایتون باشند، از جمله رشتههایی که از همان علامت نقلقول افاسترینگ دربرگیرندهشان استفاده میکنند، عبارتهای چندسطری، کامنتها، بکاسلشها و دنبالههای خنثیسازی یونیکد. بیایید این موارد را با جزئیات بررسی کنیم:
برای جزئیات بیشتر به PEP 701 مراجعه کنید. بهعنوان یک اثر جانبی مثبت از نحوه پیادهسازی این قابلیت (با تجزیه افاسترینگها توسط پارسر PEG)، اکنون پیامهای خطای افاسترینگها دقیقتر هستند و مکان دقیق خطا را در بر میگیرند. برای مثال، در پایتون 3.11، افاسترینگ زیر یک >>> 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 پیشبینی شده است. برای ایجاد مفسری با قفل مفسر سراسری مخصوص به خود، از تابع جدید 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) اختصاصی هر مفسر، به (مشارکتشده توسط اریک اسنو در gh-104210 و غیره.) PEP 669: نظارت کمتأثیر برای سیپایتون¶PEP 669 یک (مشارکتشده توسط مارک شانون در gh-103082.) PEP 688: دسترسپذیر کردن پروتکل بافر در پایتون¶PEP 688 راهی برای استفاده از پروتکل بافر در کد پایتون معرفی میکند. کلاسهایی که متد کلاس پایه انتزاعی جدید PEP 709: درونخطیسازی درکها¶درکهای دیکشنری، فهرست و مجموعه اکنون بهصورت درونخطی (inlined) درمیآیند، بهجای آنکه برای هر اجرای درک، یک شیء تابع جدید یکبارمصرف ساخته شود. این امر سرعت اجرای یک درک را تا دو برابر افزایش میدهد. برای جزئیات بیشتر به PEP 709 مراجعه کنید. متغیرهای پیمایش درک مجزا باقی میمانند؛ متغیری با همان نام در محدوده بیرونی را بازنویسی نمیکنند و پس از درک نیز قابل مشاهده نیستند. درونخطیسازی چند تغییر رفتاری قابل مشاهده به همراه دارد:
(مشارکتشده توسط Carl Meyer و Vladimir Matveev در PEP 709.) پیامهای خطای بهبودیافته¶
ویژگیهای جدید مرتبط با راهنماهای نوع¶این بخش به تغییرات عمدهای میپردازد که بر راهنمای نوع و ماژول PEP 692: استفاده از
|
imp |
importlib |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
به ادامه مراجعه کنید |
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.
تابع locale.format() ماژول locale که در پایتون 3.7 منسوخ شده بود، حذف شد؛ بهجای آن از locale.format_string() استفاده کنید. (مشارکتشده توسط Victor Stinner در gh-94226.)
ویژگیهای مستندنشدهی 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.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:
تعدادی از نامهای مستعار متدهای TestCase:
نام مستعار منسوخ |
نام متد |
منسوخ در |
|---|---|---|
|
3.1 |
|
|
3.1 |
|
|
3.1 |
|
|
3.1 |
|
|
3.1 |
|
|
3.1 |
|
|
3.1 |
|
|
3.2 |
|
|
3.2 |
|
|
3.2 |
|
|
3.2 |
|
|
3.2 |
|
|
3.2 |
|
|
3.2 |
|
|
3.5 |
میتوانید برای مدرنسازی خودکار آزمونهای واحد خود از https://github.com/isidentical/teyit استفاده کنید.
متد مستندنشده و معیوب assertDictContainsSubset از TestCase (در پایتون 3.2 منسوخ شده).
پارامتر مستندسازینشدهی use_load_tests در TestLoader.loadTestsFromModule (منسوخ و نادیده گرفتهشده از پایتون 3.5).
نام مستعاری برای کلاس TextTestResult: _TextTestResult (در پایتون 3.2 منسوخ شده است).
(مشارکتشده توسط Serhiy Storchaka در gh-89325.)
پشتیبانی از مرورگرهای منسوخ از webbrowser حذف شد. مرورگرهای حذفشده عبارتاند از: Grail، Mosaic، Netscape، Galeon، Skipstone، Iceape، Firebird و نسخههای 35 و پایینتر Firefox (gh-102871).
متد ElementTree.Element.copy() از پیادهسازی خالص پایتون، که در پایتون 3.10 منسوخ شده بود، حذف شد؛ بهجای آن از تابع copy.copy() استفاده کنید. پیادهسازی C از xml.etree.ElementTree متد copy() ندارد و فقط متد __copy__() دارد. (مشارکتشده توسط Victor Stinner در gh-94383.)
قاعدهی 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.)
در این بخش، تغییراتی که پیشتر توضیح داده شدهاند و سایر رفع اشکالهایی که ممکن است نیازمند تغییراتی در کد شما باشند، فهرست شدهاند.
اکنون قواعد سختگیرانهتری برای ارجاعهای عددی به گروهها و نامهای گروه در عبارات باقاعده اعمال میشود. اکنون فقط دنبالهای از ارقام اسکی بهعنوان ارجاع عددی پذیرفته میشود. نام گروه در الگوهای بایتی و رشتههای جایگزینی اکنون فقط میتواند شامل حروف و ارقام اسکی و زیرخط باشد. (مشارکتشده توسط سرهی استورچاکا در 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.)
رفتار قفلگذاری مستندنشدهی @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 استفاده میکنند.
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 برای توسعه دادن نوعهایی که چیدمان حافظهی نمونههایشان مات است:
PyType_Spec.basicsize میتواند صفر یا منفی باشد تا به ارث بردن یا گسترش دادن اندازه کلاس پایه را مشخص کند.
PyObject_GetTypeData() و PyType_GetTypeDataSize() برای امکان دسترسی به دادههای نمونهی مخصوص زیرکلاس افزوده شدند.
Py_TPFLAGS_ITEMS_AT_END و PyObject_GetItemData() افزوده شدند تا امکان گسترش ایمن برخی نوعهای با اندازهی متغیر، از جمله PyType_Type، فراهم شود.
Py_RELATIVE_OFFSET اضافه شد تا بتوان اعضا را بر اساس ساختاری مخصوص زیرکلاس تعریف کرد.
(مشارکتشده توسط پتر ویکتورین در 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 اکنون شمارش ارجاع را مقداردهی اولیه میکند به
SSTATE_INTERNED_IMMORTAL شناسهای برای اشیاء یونیکد درونیسازیشده
SSTATE_INTERNED_IMMORTAL شناسهای برای اشیاء یونیکد درونیسازیشده
اشیایی که درونسازی (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.)
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 قرار دهید.
مطابق با PEP 699، فیلد ma_version_tag در PyDictObject برای ماژولهای توسعهای منسوخ شده است. دسترسی به این فیلد، در زمان کامپایل یک هشدار کامپایلر تولید خواهد کرد. این فیلد در پایتون 3.14 حذف خواهد شد. (مشارکتشده توسط Ramvikrams و Kumar Aditya در gh-101193. PEP نوشتهی Ken Jin.)
منسوخ کردن متغیر پیکربندی سراسری:
Py_DebugFlag: از PyConfig.parser_debug استفاده کنید
Py_VerboseFlag: از PyConfig.verbose استفاده کنید
Py_QuietFlag: از PyConfig.quiet استفاده کنید
Py_InteractiveFlag: از PyConfig.interactive استفاده کنید
Py_InspectFlag: از PyConfig.inspect استفاده کنید
Py_OptimizeFlag: از PyConfig.optimization_level استفاده کنید
Py_NoSiteFlag: از PyConfig.site_import استفاده کنید
Py_BytesWarningFlag: از PyConfig.bytes_warning استفاده کنید
Py_FrozenFlag: از PyConfig.pathconfig_warnings استفاده کنید
Py_IgnoreEnvironmentFlag: از PyConfig.use_environment استفاده کنید
Py_DontWriteBytecodeFlag: از PyConfig.write_bytecode استفاده کنید
Py_NoUserSiteDirectory: از PyConfig.user_site_directory استفاده کنید
Py_UnbufferedStdioFlag: از PyConfig.buffered_stdio استفاده کنید
Py_HashRandomizationFlag: از PyConfig.use_hash_seed و PyConfig.hash_seed استفاده کنید
Py_IsolatedFlag: از PyConfig.isolated استفاده کنید
Py_LegacyWindowsFSEncodingFlag: استفاده از PyPreConfig.legacy_windows_fs_encoding
Py_LegacyWindowsStdioFlag: استفاده از PyConfig.legacy_windows_stdio
Py_FileSystemDefaultEncoding: از PyConfig.filesystem_encoding استفاده کنید
Py_HasFileSystemDefaultEncoding: از PyConfig.filesystem_encoding استفاده کنید
Py_FileSystemDefaultEncodeErrors: از PyConfig.filesystem_errors استفاده کنید
Py_UTF8Mode: از PyPreConfig.utf8_mode استفاده کنید (نگاه کنید به Py_PreInitialize())
به جای آن باید از API Py_InitializeFromConfig() به همراه PyConfig استفاده کرد. (مشارکت Victor Stinner در gh-77782.)
ایجاد نوعهای تغییرناپذیر با پایههای تغییرپذیر منسوخ شده است و در پایتون 3.14 غیرفعال خواهد شد. (gh-95388)
سرآیند structmember.h منسوخ شده است، هرچند همچنان در دسترس است و برنامهای برای حذف آن وجود ندارد.
محتویات آن اکنون تنها با گنجاندن Python.h در دسترس است، با افزودن پیشوند Py در صورتی که وجود نداشته باشد:
ماکروهای نوع مانند Py_T_INT، Py_T_DOUBLE و غیره (پیشتر T_INT، T_DOUBLE و غیره)
پرچمهای Py_READONLY (پیشتر READONLY) و Py_AUDIT_READ (پیشتر تماماً با حروف بزرگ)
چندین آیتم از Python.h در دسترس قرار نمیگیرند:
T_OBJECT (از Py_T_OBJECT_EX استفاده کنید)
T_NONE (پیشتر مستندنشده و بسیار عجیبوغریب)
ماکروی WRITE_RESTRICTED که کاری انجام نمیدهد.
ماکروهای RESTRICTED و READ_RESTRICTED، معادلهای Py_AUDIT_READ.
در برخی پیکربندیها، <stddef.h> از Python.h گنجانده نمیشود. هنگام استفاده از offsetof() باید آن را بهصورت دستی گنجاند.
سرآیند منسوخ همچنان محتوای اصلی خود را با نامهای اصلی ارائه میدهد. کد قدیمی شما میتواند بدون تغییر باقی بماند، مگر اینکه include اضافی و ماکروهای بدون فضای نام برایتان بسیار آزاردهنده باشند.
(ارائه شده در gh-47146 توسط Petr Viktorin، بر پایهی کارهای پیشین Alexander Belopolsky و Matthias Braun.)
PyErr_Fetch() و PyErr_Restore() منسوخ شدهاند. به جای آنها از PyErr_GetRaisedException() و PyErr_SetRaisedException() استفاده کنید. (مشارکتشده توسط Mark Shannon در gh-101578.)
PyErr_Display() منسوخ شده است. به جای آن از PyErr_DisplayException() استفاده کنید. (مشارکتشده توسط Irit Katriel در gh-102755).
_PyErr_ChainExceptions منسوخ شده است. به جای آن از _PyErr_ChainExceptions1 استفاده کنید. (مشارکتشده توسط Irit Katriel در gh-102192.)
استفاده از PyType_FromSpec()، PyType_FromSpecWithBases() یا PyType_FromModuleAndSpec() برای ایجاد کلاسی که فراکلاس آن tp_new را بازنویسی میکند، منسوخ شده است. به جای آن، فراکلاس را فراخوانی کنید.
فیلد ma_version_tag در PyDictObject برای ماژولهای توسعهای (PEP 699؛ gh-101193).
ایجاد نوعهای تغییرناپذیر با کلاسهای پایهی تغییرپذیر (gh-95388).
تابعی که PyImport_ImportModuleNoBlock() بود: بهجای آن از PyImport_ImportModule() استفاده کنید.
PyWeakref_GetObject() و PyWeakref_GET_OBJECT(): بهجای آنها از PyWeakref_GetRef() استفاده کنید. پروژهی pythoncapi-compat project میتواند برای دریافت PyWeakref_GetRef() در پایتون ۳.۱۲ و قدیمیتر استفاده شود.
PyUnicode_AsDecodedObject(): بهجای آن از PyCodec_Decode() استفاده کنید.
PyUnicode_AsDecodedUnicode(): به جای آن از PyCodec_Decode() استفاده کنید؛ توجه داشته باشید که برخی کدکها، برای مثال "base64"، ممکن است نوعی غیر از str، مانند bytes برگردانند.
PyUnicode_AsEncodedObject(): به جای آن از PyCodec_Encode() استفاده کنید.
PyUnicode_AsEncodedUnicode(): بهجای آن از PyCodec_Encode() استفاده کنید؛ توجه داشته باشید که برخی کدکها (برای مثال، "base64") ممکن است نوعی غیر از bytes، مانند str برگردانند.
توابع مقداردهی اولیه پایتون، منسوخشده در پایتون 3.13:
Py_GetPath(): بهجای آن از PyConfig_Get("module_search_paths") (sys.path) استفاده کنید.
Py_GetPrefix(): بهجای آن از PyConfig_Get("base_prefix") (sys.base_prefix) استفاده کنید. اگر نیاز به مدیریت محیطهای مجازی است، از PyConfig_Get("prefix") (sys.prefix) استفاده کنید.
Py_GetExecPrefix(): بهجای آن از PyConfig_Get("base_exec_prefix") (sys.base_exec_prefix) استفاده کنید. اگر نیاز به مدیریت محیطهای مجازی است، از PyConfig_Get("exec_prefix") (sys.exec_prefix) استفاده کنید.
Py_GetProgramFullPath(): بهجای آن از PyConfig_Get("executable") (sys.executable) استفاده کنید.
Py_GetProgramName(): بهجای آن از PyConfig_Get("executable") (sys.executable) استفاده کنید.
Py_GetPythonHome(): بهجای آن از PyConfig_Get("home") یا متغیر محیطی PYTHONHOME استفاده کنید.
میتوان از پروژهی pythoncapi-compat برای دسترسی به PyConfig_Get() در پایتون 3.13 و قدیمیتر استفاده کرد.
توابعی برای پیکربندی راهاندازی پایتون، که در پایتون 3.11 منسوخ شدهاند:
PySys_SetArgvEx(): بهجای آن، PyConfig.argv را تنظیم کنید.
PySys_SetArgv(): بهجای آن، PyConfig.argv را تنظیم کنید.
Py_SetProgramName(): به جای آن، PyConfig.program_name را تنظیم کنید.
Py_SetPythonHome(): به جای آن، PyConfig.home را تنظیم کنید.
PySys_ResetWarnOptions(): بهجای آن sys.warnoptions و warnings.filters را پاکسازی کنید.
بهجای آن، باید از API تابع Py_InitializeFromConfig() به همراه PyConfig استفاده کرد.
متغیرهای پیکربندی سراسری:
Py_DebugFlag: بهجای آن از PyConfig.parser_debug یا PyConfig_Get("parser_debug") استفاده کنید.
Py_VerboseFlag: به جای آن از PyConfig.verbose یا PyConfig_Get("verbose") استفاده کنید.
Py_QuietFlag: به جای آن از PyConfig.quiet یا PyConfig_Get("quiet") استفاده کنید.
Py_InteractiveFlag: به جای آن از PyConfig.interactive یا PyConfig_Get("interactive") استفاده کنید.
Py_InspectFlag: به جای آن از PyConfig.inspect یا PyConfig_Get("inspect") استفاده کنید.
Py_OptimizeFlag: بهجای آن از PyConfig.optimization_level یا PyConfig_Get("optimization_level") استفاده کنید.
Py_NoSiteFlag: به جای آن از PyConfig.site_import یا PyConfig_Get("site_import") استفاده کنید.
Py_BytesWarningFlag: به جای آن از PyConfig.bytes_warning یا PyConfig_Get("bytes_warning") استفاده کنید.
Py_FrozenFlag: بهجای آن از PyConfig.pathconfig_warnings یا PyConfig_Get("pathconfig_warnings") استفاده کنید.
Py_IgnoreEnvironmentFlag: بهجای آن از PyConfig.use_environment یا PyConfig_Get("use_environment") استفاده کنید.
Py_DontWriteBytecodeFlag: بهجای آن از PyConfig.write_bytecode یا PyConfig_Get("write_bytecode") استفاده کنید.
Py_NoUserSiteDirectory: بهجای آن از PyConfig.user_site_directory یا PyConfig_Get("user_site_directory") استفاده کنید.
Py_UnbufferedStdioFlag: به جای آن از PyConfig.buffered_stdio یا PyConfig_Get("buffered_stdio") استفاده کنید.
Py_HashRandomizationFlag: به جای آن از PyConfig.use_hash_seed و PyConfig.hash_seed یا PyConfig_Get("hash_seed") استفاده کنید.
Py_IsolatedFlag: بهجای آن از PyConfig.isolated یا PyConfig_Get("isolated") استفاده کنید.
Py_LegacyWindowsFSEncodingFlag: بهجای آن از PyPreConfig.legacy_windows_fs_encoding یا PyConfig_Get("legacy_windows_fs_encoding") استفاده کنید.
Py_LegacyWindowsStdioFlag: به جای آن از PyConfig.legacy_windows_stdio یا PyConfig_Get("legacy_windows_stdio") استفاده کنید.
Py_FileSystemDefaultEncoding، Py_HasFileSystemDefaultEncoding: به جای آن از PyConfig.filesystem_encoding یا PyConfig_Get("filesystem_encoding") استفاده کنید.
Py_FileSystemDefaultEncodeErrors: بهجای آن از PyConfig.filesystem_errors یا PyConfig_Get("filesystem_errors") استفاده کنید.
Py_UTF8Mode: بهجای آن از PyPreConfig.utf8_mode یا PyConfig_Get("utf8_mode") استفاده کنید. (نگاه کنید به Py_PreInitialize())
برای تنظیم این گزینهها باید از API Py_InitializeFromConfig() همراه با PyConfig استفاده شود. یا میتوان از PyConfig_Get() برای دریافت این گزینهها در رانتایم استفاده کرد.
نسخهی همراه libmpdec.
APIهای زیر منسوخ شدهاند و حذف خواهند شد، هرچند در حال حاضر هیچ تاریخی برای حذف آنها تعیین نشده است.
Py_TPFLAGS_HAVE_FINALIZE: از پایتون 3.8 به بعد مورد نیاز نیست.
PyErr_Fetch(): به جای آن از PyErr_GetRaisedException() استفاده کنید.
PyErr_NormalizeException(): به جای آن از PyErr_GetRaisedException() استفاده کنید.
PyErr_Restore(): بهجای آن از PyErr_SetRaisedException() استفاده کنید.
PyModule_GetFilename(): بهجای آن از PyModule_GetFilenameObject() استفاده کنید.
PyOS_AfterFork(): به جای آن از PyOS_AfterFork_Child() استفاده کنید.
PySlice_GetIndicesEx(): بهجای آن از PySlice_Unpack() و PySlice_AdjustIndices() استفاده کنید.
PyUnicode_READY(): از پایتون 3.12 به بعد نیازی به آن نیست
PyErr_Display(): بهجای آن از PyErr_DisplayException() استفاده کنید.
_PyErr_ChainExceptions(): بهجای آن از _PyErr_ChainExceptions1() استفاده کنید.
عضو PyBytesObject.ob_shash: به جای آن PyObject_Hash() را فراخوانی کنید.
API ذخیرهسازی محلی نخ (TLS):
PyThread_create_key(): بهجای آن از PyThread_tss_alloc() استفاده کنید.
PyThread_delete_key(): بهجای آن از PyThread_tss_free() استفاده کنید.
PyThread_set_key_value(): بهجای آن از PyThread_tss_set() استفاده کنید.
PyThread_get_key_value(): بهجای آن از PyThread_tss_get() استفاده کنید.
PyThread_delete_key_value(): بهجای آن از PyThread_tss_delete() استفاده کنید.
PyThread_ReInitTLS(): از پایتون 3.7 به بعد مورد نیاز نیست.
حذف پروندهی سرآیند 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.)