GeezerVison is showing python.github.io — تازههای پایتون 3.13
تازههای پایتون 3.13¶
- ویرایشگرها:
Adam Turner و Thomas Wouters
این مقاله قابلیتهای جدید پایتون 3.13 را در مقایسه با 3.12 توضیح میدهد. پایتون 3.13 در ۷ اکتبر ۲۰۲۴ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید.
همچنین ببینید
PEP 719 -- زمانبندی انتشار پایتون 3.13
خلاصه -- نکات برجستهی انتشار¶
پایتون 3.13 نسخهای پایدار از زبان برنامهنویسی پایتون است که ترکیبی از تغییرات در زبان، پیادهسازی و کتابخانه استاندارد را در بر میگیرد. بزرگترین تغییرات شامل مفسر تعاملی جدید، پشتیبانی آزمایشی از اجرا در حالت نخآزاد (PEP 703) و کامپایلر در لحظه (JIT) (PEP 744) است.
پیامهای خطا همچنان بهبود مییابند و ردگیریها اکنون بهطور پیشفرض بهصورت رنگی برجسته میشوند. تابع توکار locals() اکنون دارای معناشناسی تعریفشده برای تغییر نگاشت بازگرداندهشده است و پارامترهای نوع اکنون از مقادیر پیشفرض پشتیبانی میکنند.
تغییرات کتابخانه شامل حذف APIها و ماژولهای منسوخ، و همچنین بهبودهای همیشگی در کاربرپسندی و صحت است. چندین ماژول قدیمی کتابخانه استاندارد اکنون در پی منسوخشدنشان در پایتون 3.11 حذف شدهاند (PEP 594).
این مقاله تلاش نمیکند مشخصات کاملی از تمام ویژگیهای جدید ارائه دهد، بلکه در عوض مروری کلی و مناسب ارائه میکند. برای جزئیات کامل به مستنداتی مانند مرجع کتابخانه و مرجع زبان مراجعه کنید. برای درک پیادهسازی کامل و دلایل طراحی یک تغییر، به PEP مربوط به ویژگی جدید مورد نظر مراجعه کنید؛ اما توجه داشته باشید که PEPها معمولاً پس از پیادهسازی کامل یک ویژگی، بهروز نگه داشته نمیشوند. برای راهنمایی دربارهی ارتقا از نسخههای قبلی پایتون، Porting to Python 3.13 را ببینید.
بهبودهای مفسر:
بهبودهای مدل داده پایتون:
بهبودهای چشمگیر در کتابخانه استاندارد:
بهبودهای امنیتی:
بهبودهای C API:
جایگاه Py_mod_gil اکنون برای نشان دادن اینکه یک ماژول توسعهای از اجرا با GIL غیرفعال پشتیبانی میکند، استفاده میشود.
PyTime C API افزوده شده است که دسترسی به ساعتهای سیستم را فراهم میکند.
PyMutex یک قفل متقابل سبکوزن جدید است که تنها یک بایت فضا اشغال میکند.
در C API، بدنهای جدید از توابع برای تولید رویدادهای نظارتی PEP 669 وجود دارد.
ویژگیهای جدید نوعدهی:
پشتیبانی پلتفرم:
حذفهای مهم:
PEP 594: ۱۹ «باتری مرده» باقیمانده (ماژولهای قدیمی کتابخانه استاندارد) از کتابخانه استاندارد حذف شدهاند: aifc، audioop، cgi، cgitb، chunk، crypt، imghdr، mailcap، msilib، nis، nntplib، ossaudiodev، pipes، sndhdr، spwd، sunau، telnetlib، uu و xdrlib.
ابزار 2to3 و ماژول lib2to3 حذف شدند (منسوخ در پایتون 3.11).
حذف ماژول tkinter.tix (منسوخ در Python 3.6).
تابع locale.resetlocale() حذف شد.
فضاهای نام typing.io و typing.re حذف شدند.
توصیفگرهای زنجیرهای classmethod حذف شدند.
تغییرات زمانبندی انتشار:
PEP 602 («چرخه انتشار سالانه پایتون») بهروزرسانی شده است تا دوره پشتیبانی کامل («رفع اشکال») برای نسخههای جدید به دو سال تمدید شود. این سیاست بهروزرسانیشده بدان معناست که:
ویژگیهای جدید¶
مفسر تعاملی بهتر¶
پایتون اکنون بهصورت پیشفرض از یک پوستهی تعاملی جدید استفاده میکند که بر پایهی کد PyPy project است. هنگامی که کاربر REPL را از یک پایانهی تعاملی راهاندازی میکند، اکنون از قابلیتهای جدید زیر پشتیبانی میشود:
ویرایش چندسطری با حفظ تاریخچه.
پشتیبانی مستقیم از دستورهای مخصوص REPL مانند help، exit و quit، بدون نیاز به فراخوانی آنها بهعنوان تابع.
اعلانها و ردگیریها با رنگ فعال بهصورت پیشفرض.
مرور تعاملی راهنما با استفاده از F1 به همراه یک تاریخچه فرمان جداگانه.
مرور تاریخچه با استفاده از F2 که از خروجی و همچنین اعلانهای >>> و ... عبور میکند.
«حالت چسباندن» با F3 که چسباندن بلوکهای بزرگتر کد را آسانتر میکند (برای بازگشت به اعلان معمولی، دوباره F3 را فشار دهید).
برای غیرفعال کردن پوسته تعاملی جدید، متغیر محیطی PYTHON_BASIC_REPL را تنظیم کنید. برای اطلاعات بیشتر دربارهی حالت تعاملی، حالت تعاملی را ببینید.
(ارائهشده توسط Pablo Galindo Salgado، Łukasz Langa و Lysandros Nikolaou در gh-111201 بر پایهی کدی از پروژهی PyPy. پشتیبانی ویندوز ارائهشده توسط Dino Viehland و Anthony Shaw.)
پیامهای خطای بهبودیافته¶
مفسر اکنون بهطور پیشفرض هنگام نمایش ردگیریها در پایانه از رنگ استفاده میکند. این قابلیت قابل کنترل است از طریق متغیر محیطی جدید PYTHON_COLORS و همچنین متغیرهای محیطی کانونیکال NO_COLOR و FORCE_COLOR. (مشارکتشده توسط Pablo Galindo Salgado در gh-112730.)
یک اشتباه رایج این است که اسکریپتی با همان نام یک ماژول کتابخانه استاندارد نوشته شود. هنگامی که این موضوع منجر به خطا میشود، اکنون پیام خطای مفیدتری نمایش میدهیم:
$ python random.py
Traceback (most recent call last):
File "/home/me/random.py", line 1, in <module>
import random
File "/home/me/random.py", line 3, in <module>
print(random.randint(5))
^^^^^^^^^^^^^^
AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
بهطور مشابه، اگر اسکریپتی همنام با ماژول شخص ثالثی باشد که میخواهد آن را ایمپورت کند و این کار منجر به خطا شود، ما نیز پیام خطای مفیدتری نمایش میدهیم:
$ python numpy.py
Traceback (most recent call last):
File "/home/me/numpy.py", line 1, in <module>
import numpy as np
File "/home/me/numpy.py", line 3, in <module>
np.array([1, 2, 3])
^^^^^^^^
AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
(مشارکتشده توسط Shantanu Jain در gh-95754.)
پیام خطا اکنون تلاش میکند تا هنگامی که آرگومان کلیدواژهای نادرستی به یک تابع ارسال میشود، آرگومان کلیدواژهای صحیح را پیشنهاد دهد.
>>> "Better error messages!".split(max_split=1)
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
"Better error messages!".split(max_split=1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
(مشارکتشده توسط Pablo Galindo Salgado و Shantanu Jain در gh-107944.)
سیپایتون نخآزاد¶
سیپایتون اکنون بهصورت آزمایشی از اجرا در حالت نخآزاد، با global interpreter lock (GIL) غیرفعال، پشتیبانی میکند. این یک ویژگی آزمایشی است و بنابراین بهصورت پیشفرض فعال نیست. حالت نخآزاد به یک پرونده اجرایی متفاوت نیاز دارد که معمولاً python3.13t یا python3.13t.exe نام دارد. میتوان پروندههای دودویی پیشساختهای را که با برچسب نخآزاد مشخص شدهاند، بهعنوان بخشی از نصبکنندههای رسمی Windows و macOS نصب کرد، یا میتوان سیپایتون را از کد منبع با گزینهی --disable-gil ساخت.
اجرای نخآزاد با اجرای موازی نخها روی هستههای CPU موجود، امکان بهرهبرداری کامل از توان پردازشی در دسترس را فراهم میکند. اگرچه همهی نرمافزارها بهطور خودکار از این امر بهرهمند نمیشوند، برنامههایی که با در نظر گرفتن نخبندی طراحی شدهاند، روی سختافزار چندهستهای سریعتر اجرا میشوند. حالت نخآزاد آزمایشی است و کار روی بهبود آن ادامه دارد: انتظار داشته باشید با برخی اشکالات و افت عملکرد قابلتوجه در حالت تکنخی مواجه شوید. نسخههای نخآزاد سیپایتون از اجرای اختیاری با فعال بودن قفل مفسر سراسری در رانتایم، با استفاده از متغیر محیطی PYTHON_GIL یا گزینهی خط فرمان -X gil=1 پشتیبانی میکنند.
برای بررسی اینکه آیا مفسر فعلی از نخبندی آزاد پشتیبانی میکند، python -VV و sys.version شامل عبارت "experimental free-threading build" هستند. از تابع جدید sys._is_gil_enabled() میتوان برای بررسی اینکه آیا قفل مفسر سراسری در فرایند در حال اجرا واقعاً غیرفعال است، استفاده کرد.
ماژولهای توسعهای C-API باید بهطور خاص برای ساخت نخآزاد ساخته شوند. افزونههایی که از اجرا با GIL غیرفعال پشتیبانی میکنند، باید از جایگاه Py_mod_gil استفاده کنند. افزونههایی که از مقداردهی اولیه تکمرحلهای استفاده میکنند، باید از PyUnstable_Module_SetGIL() استفاده کنند تا مشخص کنند که آیا از اجرا با GIL غیرفعال پشتیبانی میکنند یا خیر. ایمپورت کردن افزونههای C که از این سازوکارها استفاده نمیکنند، باعث فعال شدن GIL میشود، مگر اینکه GIL بهطور صریح با متغیر محیطی PYTHON_GIL یا گزینهی -X gil=0 غیرفعال شده باشد. برای نصب بستههای دارای افزونههای C در ساخت نخآزاد، به pip 24.1 یا جدیدتر نیاز است.
انجام این کار به لطف افراد و سازمانهای بسیاری ممکن شد، از جمله کامیونیتی بزرگ مشارکتکنندگان در پایتون و پروژههای شخص ثالث برای آزمودن و فعالسازی پشتیبانی از نخبندی آزاد. از مشارکتکنندگان برجسته میتوان به Sam Gross، Ken Jin، Donghee Na، Itamar Oren، Matt Page، Brett Simmers، Dino Viehland، Carl Meyer، Nathan Goldbaum، Ralf Gommers، Lysandros Nikolaou و بسیاری دیگر اشاره کرد. بسیاری از این مشارکتکنندگان در استخدام Meta هستند که منابع مهندسی چشمگیری برای پشتیبانی از این پروژه فراهم کرده است.
یک کامپایلر آزمایشی در لحظه¶
وقتی سیپایتون با استفاده از گزینهی --enable-experimental-jit پیکربندی و ساخته شود، کامپایلری در لحظه افزوده میشود که ممکن است سرعت برخی برنامههای پایتون را افزایش دهد. در ویندوز، برای فعالسازی JIT از PCbuild/build.bat --experimental-jit استفاده کنید یا برای فعالسازی مفسر سطح ۲ (Tier 2) از --experimental-jit-interpreter استفاده کنید. نیازمندیهای ساخت و اطلاعات پشتیبان بیشتر در Tools/jit/README.md آمدهاند.
گزینهی --enable-experimental-jit این مقادیر (اختیاری) را میپذیرد و اگر --enable-experimental-jit بدون مقدار اختیاری ذکر شود، مقدار پیشفرض yes است.
no: کل خط لوله Tier 2 و JIT را غیرفعال میکند.
yes: فعالسازی JIT. برای غیرفعالسازی JIT در زمان اجرا، متغیر محیطی PYTHON_JIT=0 را تنظیم کنید.
yes-off: JIT را میسازد اما بهطور پیشفرض آن را غیرفعال میکند. برای فعالسازی JIT در زمان اجرا، متغیر محیطی PYTHON_JIT=1 را تنظیم کنید.
interpreter: مفسر Tier 2 را فعال میکند اما JIT را غیرفعال میکند. مفسر را میتوان با اجرا بههمراه PYTHON_JIT=0 غیرفعال کرد.
معماری داخلی تقریباً به شرح زیر است:
با بایتکد تخصصی سطح ۱ (Tier 1) آغاز میکنیم. برای جزئیات به تازههای 3.11 مراجعه کنید.
وقتی بایتکد Tier 1 بهاندازه کافی داغ شود، به یک نمایش میانی (IR) جدید و کاملاً داخلی ترجمه میشود که Tier 2 IR نامیده میشود و گاهی نیز به آن میکرو-عملیات («uops») گفته میشود.
نمایش میانی (IR) سطح ۲ از همان ماشین مجازی مبتنی بر پشتهی سطح ۱ استفاده میکند، اما قالب دستورالعمل آن برای ترجمه به کد ماشین مناسبتر است.
ما چندین مرحلهی بهینهسازی برای Tier 2 IR داریم که پیش از آنکه تفسیر شود یا به کد ماشین ترجمه شود، اعمال میشوند.
یک مفسر سطح ۲ (Tier 2) وجود دارد، اما این مفسر عمدتاً برای اشکالزدایی مراحل اولیهی خط لولهی بهینهسازی (pipeline) در نظر گرفته شده است. مفسر سطح ۲ را میتوان با پیکربندی پایتون از طریق --enable-experimental-jit=interpreter فعال کرد.
هنگامی که JIT فعال باشد، نمایش میانی سطح ۲ (Tier 2 IR) بهینهشده به کد ماشین تبدیل میشود و سپس اجرا میگردد.
فرایند ترجمه به کد ماشین از تکنیکی به نام کپیوپچ (copy-and-patch) استفاده میکند. این فرایند هیچ وابستگی رانتایمی ندارد، اما وابستگی جدیدی در زمان ساخت به LLVM وجود دارد.
(JIT توسط برانت بوخر، الهامگرفته از مقالهای از هائوران شو و فردریک کیولستاد. نمایش میانی (IR) سطح ۲ توسط مارک شانون و گیدو ون روسوم. بهینهساز سطح ۲ توسط کن جین.)
معناشناسی تغییر برای locals() تعریف شد¶
از نظر تاریخی، نتیجه مورد انتظار تغییر دادن مقدار بازگشتی locals() به هر یک از پیادهسازیهای پایتون واگذار شده بود تا آن را تعریف کند. از پایتون 3.13 به بعد، PEP 667 رفتار تاریخی سیپایتون را برای اغلب محدودههای اجرای کد استاندارد میکند، اما محدودههای بهینهشده (توابع، تولیدگرها، همروالها، درکها و عبارتهای تولیدگر) را تغییر میدهد تا بهصراحت تصاویر لحظهای مستقلی از متغیرهای محلی که در حال حاضر انتساب یافتهاند، از جمله متغیرهای غیرمحلی که بهصورت محلی به آنها ارجاع داده شده و در بستارها ثبت شدهاند، بازگردانند.
این تغییر در معناشناسی locals() در محدودههای بهینهشده، بر رفتار پیشفرض توابع اجرای کد نیز تأثیر میگذارد؛ این توابع در صورت ارائهنشدن فضای نام صریح، بهطور ضمنی locals() را هدف میگیرند (مانند exec() و eval()). در نسخههای پیشین، اینکه آیا پس از فراخوانی تابع اجرای کد میتوان با فراخوانی locals() به تغییرات دسترسی داشت یا نه، وابسته به پیادهسازی بود. بهطور خاص در سیپایتون، چنین کدی معمولاً بهظاهر بهدرستی کار میکرد، اما گاهی ممکن بود در محدودههای بهینهشده، بسته به کدهای دیگر (از جمله اشکالزداها و ابزارهای ردگیری اجرای کد) که ممکن بود تصویر لحظهای مشترک را در آن محدوده بازنشانی کنند، شکست بخورد. اکنون، کد همیشه نسبت به یک تصویر لحظهای مستقل از متغیرهای محلی در محدودههای بهینهشده اجرا میشود و در نتیجه، تغییرات هرگز در فراخوانیهای بعدی locals() قابل مشاهده نخواهند بود. برای دسترسی به تغییراتی که در این موارد ایجاد شدهاند، اکنون باید یک ارجاع صریح به فضای نام، به تابع مربوطه ارسال شود. بهعنوان جایگزین، ممکن است منطقی باشد که کد متأثر را بهروزرسانی کنید تا از یک API اجرای کد سطح بالاتر که فضای نام حاصل از اجرای کد را برمیگرداند استفاده کند (برای مثال runpy.run_path() هنگام اجرای پروندههای پایتون از دیسک).
برای اطمینان از اینکه اشکالزداها و ابزارهای مشابه بتوانند متغیرهای محلی را در محدودههای متأثر از این تغییر بهطور قابل اطمینان بهروزرسانی کنند، FrameType.f_locals اکنون بهجای بازگرداندن یک نمونه dict مشترک که بهطور ناسازگار بهروزرسانی میشد و معناشناسی زمان اجرای تعریفنشدهای داشت، یک پراکسی نوشتنهمزمان به متغیرهای محلی فریم و متغیرهای غیرمحلی (nonlocal) ارجاعشده بهصورت محلی در این محدودهها برمیگرداند.
برای جزئیات بیشتر، از جمله تغییرات مرتبط در C API و موارد منسوخشده، به PEP 667 مراجعه کنید. یادداشتهای انتقال برای APIهای پایتون و APIهای C که تحت تأثیر قرار گرفتهاند نیز در ادامه ارائه شدهاند.
(PEP و پیادهسازی آن توسط Mark Shannon و Tian Gao در gh-74929 ارائه شدهاند. بهروزرسانیهای مستندات توسط Guido van Rossum و Alyssa Coghlan فراهم شده است.)
پشتیبانی از پلتفرمهای موبایل¶
PEP 730: iOS اکنون یک پلتفرم پشتیبانیشده بر اساس PEP 11 است، با هدفهای arm64-apple-ios و arm64-apple-ios-simulator در سطح ۳ (به ترتیب دستگاههای iPhone و iPad که پس از ۲۰۱۳ عرضه شدهاند، و شبیهساز Xcode iOS در حال اجرا بر روی سختافزار Apple silicon). x86_64-apple-ios-simulator (شبیهساز Xcode iOS در حال اجرا بر روی سختافزار قدیمیتر x86_64) یک پلتفرم پشتیبانیشده در سطح ۳ نیست، اما از پشتیبانی در حد توان (best-effort) برخوردار خواهد بود. (PEP توسط Russell Keith-Magee نوشته شده و پیادهسازی آن در gh-114099 ارائه شده است.)
PEP 738: اندروید اکنون یک پلتفرم پشتیبانیشدهی PEP 11 است، با هدفهای aarch64-linux-android و x86_64-linux-android در سطح ۳. هدفهای ۳۲بیتی arm-linux-androideabi و i686-linux-android پلتفرمهای پشتیبانیشدهی سطح ۳ نیستند، اما پشتیبانی در حد توان (best-effort) خواهند داشت. (PEP نوشتهشده و پیادهسازی توسط Malcolm Smith در gh-116622 ارائهشده است.)
سایر تغییرات زبان¶
کامپایلر اکنون فضای سفید ابتدایی مشترک را از هر سطر در یک رشته مستند حذف میکند. این امر اندازهی نهانگاه بایتکد (مانند پروندههای .pyc) را کاهش میدهد؛ برای مثال، در sqlalchemy.orm.session از SQLAlchemy 2.0 کاهشی حدود ۵٪ در اندازهی پرونده حاصل میشود. این تغییر بر ابزارهایی که از رشتههای مستند استفاده میکنند، مانند doctest، تأثیر میگذارد.
>>> def spam():
... """
... This is a docstring with
... leading whitespace.
...
... It even has multiple paragraphs!
... """
...
>>> spam.__doc__
'\nThis is a docstring with\n leading whitespace.\n\nIt even has multiple paragraphs!\n'
(مشارکتشده توسط Inada Naoki در gh-81283.)
محدودههای حاشیهنویسی درون محدودههای کلاس اکنون میتوانند شامل لامبداها و درکها باشند. درکهایی که درون محدودههای کلاس قرار دارند، در محدوده والد خود درونخطی نمیشوند.
class C[T]:
type Alias = lambda: T
(مشارکت Jelle Zijlstra در gh-109118 و gh-118160.)
دستورهای آینده دیگر توسط ایمپورتهای نسبی ماژول __future__ فعال نمیشوند؛ به این معنا که دستورهایی به شکل from .__future__ import ... اکنون صرفاً ایمپورتهای نسبی استاندارد هستند، بدون فعال شدن هیچ ویژگی خاصی. (مشارکتشده توسط Jeremiah Gabriel Pascual در gh-118216.)
اعلانهای global اکنون در بلوکهای except مجاز هستند، زمانی که آن متغیر سراسری در بلوک else استفاده شود. قبلاً این کار یک SyntaxError نادرست ایجاد میکرد. (مشارکتشده توسط Irit Katriel در gh-111123.)
افزودن PYTHON_FROZEN_MODULES، متغیر محیطی جدیدی که تعیین میکند آیا ماژولهای فریزشده توسط سازوکار ایمپورت نادیده گرفته شوند یا خیر، و معادل گزینهی خط فرمان -X frozen_modules است. (مشارکتشده توسط Yilei Yang در gh-111374.)
پشتیبانی از پروفایلگیر perf که بدون اشارهگرهای فریم (frame pointers) کار میکند، از طریق متغیر محیطی جدید PYTHON_PERF_JIT_SUPPORT و گزینهی خط فرمان -X perf_jit افزوده شد. (ارائهشده توسط پابلو گالیندو در gh-118518.)
مکان پروندهی .python_history را میتوان از طریق متغیر محیطی جدید PYTHON_HISTORY تغییر داد. (مشارکتشده توسط Levi Sabah، Zackery Spytz و Hugo van Kemenade در gh-73965.)
کلاسها ویژگی جدید __static_attributes__ دارند. این ویژگی توسط کامپایلر با تاپلی از نامهای ویژگیهای کلاس که از طریق self.<name> از هر تابعی در بدنهی آن انتساب داده میشوند، پر میشود. (مشارکت Irit Katriel در gh-115775.)
کامپایلر اکنون ویژگی __firstlineno__ را روی کلاسها ایجاد میکند که مقدار آن شمارهی سطر اول تعریف کلاس است. (با مشارکت Serhiy Storchaka در gh-118465.)
توکارهای exec() و eval() اکنون آرگومانهای globals و locals را بهصورت کلیدواژه میپذیرند. (مشارکتشده توسط Raphael Gaschignard در gh-105879)
تابع توکار compile() اکنون پرچم جدید ast.PyCF_OPTIMIZED_AST را میپذیرد که مشابه ast.PyCF_ONLY_AST است، با این تفاوت که درخت سینتکس انتزاعی (AST) برگرداندهشده مطابق با مقدار آرگومان optimize بهینهسازی میشود. (مشارکتشده توسط Irit Katriel در gh-108113.)
افزودن ویژگی __name__ به اشیای property. (مشارکتشده توسط Eugene Toder در gh-101860.)
افزودن PythonFinalizationError، استثنای جدیدی که از RuntimeError مشتق شده و برای اعلام زمانی که عملیاتها در طول نهاییسازی مسدود میشوند استفاده میشود. فراخوانیپذیرهای زیر اکنون بهجای RuntimeError، PythonFinalizationError را raise میکنند:
(مشارکتشده توسط Victor Stinner در gh-114570.)
اجازه دادن به آرگومان count در str.replace() تا بهصورت کلیدواژه باشد. (مشارکتشده توسط Hugo van Kemenade در gh-106487.)
بسیاری از توابع اکنون اگر مقدار بولی بهعنوان آرگومان توصیفگر پرونده پاس داده شود، هشداری نشان میدهند. این میتواند به گرفتن برخی خطاها در مرحلهی زودتر کمک کند. (ارائهشده توسط سرهی استورچاکا در gh-82626.)
ویژگیهای name و mode برای اشیاء شبهپروندهی فشرده و بایگانیشده در ماژولهای bz2، lzma، tarfile و zipfile افزوده شد. (مشارکت سرهی استورچاکا در gh-115961.)
ماژولهای بهبودیافته¶
array¶
افزودن کد نوع 'w' (Py_UCS4) برای نویسههای یونیکد. به جای کد نوع منسوخ 'u' باید از آن استفاده شود. (مشارکتشده توسط Inada Naoki در gh-80480.)
ثبت array.array بهعنوان یک MutableSequence با پیادهسازی متد clear(). (ارائهشده توسط Mike Zimin در gh-114894.)
ast¶
سازندههای نوعهای گره در ماژول ast اکنون در آرگومانهایی که میپذیرند سختگیرانهتر هستند و هنگامی که آرگومانها حذف شوند، رفتار شهودیتری دارند.
اگر یک فیلد اختیاری روی یک گره AST هنگام ساخت یک نمونه بهعنوان آرگومان گنجانده نشود، آن فیلد اکنون روی None تنظیم خواهد شد. بهطور مشابه، اگر یک فیلد فهرستی حذف شود، آن فیلد اکنون روی یک فهرست خالی تنظیم خواهد شد، و اگر یک فیلد expr_context حذف شود، پیشفرض آن Load() خواهد بود. (پیشتر، در همهی موارد، این ویژگی روی نمونهی گره AST تازهساختهشده وجود نداشت.)
در تمام موارد دیگر، هرگاه آرگومان الزامی حذف شود، سازندهی گره یک DeprecationWarning نشان خواهد داد. این کار در پایتون 3.15 استثنا پرتاب خواهد کرد. بهطور مشابه، ارسال آرگومان کلیدواژهای به سازنده که به فیلدی روی گرهی AST نگاشت نشود، اکنون منسوخ شده است و در پایتون 3.15 استثنا پرتاب خواهد کرد.
این تغییرات بر زیرکلاسهای ast.AST که توسط کاربر تعریف شدهاند اعمال نمیشوند، مگر آنکه کلاس با تعریف نگاشت AST._field_types رفتار جدید را بپذیرد.
(مشارکت Jelle Zijlstra در gh-105858، gh-117486 و gh-118851.)
ast.parse() اکنون یک آرگومان اختیاری optimize را میپذیرد که به compile() منتقل میشود. این امر امکان به دست آوردن یک AST بهینهشده را فراهم میکند. (مشارکتشده توسط ایریت کاتریل در gh-108113.)
asyncio¶
asyncio.as_completed() اکنون شیءای را برمیگرداند که هم یک پیمایشگر ناهمگام است و هم یک پیمایشگر ساده از انتظارپذیرها. انتظارپذیرهایی که توسط پیمایش ناهمگام تولید میشوند، شامل اشیاء اصلی وظیفه یا آیندهنما هستند که به آن پاس داده شدهاند؛ این امر مرتبط کردن نتایج با وظایف در حال تکمیل را آسانتر میکند. (مشارکتشده توسط Justin Arthur در gh-77714.)
asyncio.loop.create_unix_server() اکنون هنگام بسته شدن سرور، سوکت یونیکس را بهطور خودکار حذف میکند. (مشارکتشده توسط Pierre Ossman در gh-111246.)
DatagramTransport.sendto() اکنون در صورت فراخوانی با یک شیء بایت خالی، دیتاگرامهایی با طول صفر ارسال میکند. کنترل جریان ترابری نیز اکنون هنگام محاسبه اندازه بافر، سرآیند دیتاگرام را در نظر میگیرد. (مشارکتشده توسط Jamie Phan در gh-115199.)
Queue.shutdown و QueueShutDown برای مدیریت خاتمه صف افزوده شدند. (با مشارکت Laurie Opperman و Yves Duprat در gh-104228.)
افزودن متدهای Server.close_clients() و Server.abort_clients() که یک سرور asyncio را با قاطعیت بیشتری میبندند. (مشارکتشده توسط Pierre Ossman در gh-113538.)
پذیرش تاپلی از جداکنندهها در StreamReader.readuntil()، که هنگام مواجهه با هر یک از آنها متوقف میشود. (مشارکتشده توسط Bruce Merry در gh-81322.)
رفتار TaskGroup هنگامی که یک لغو بیرونی با یک لغو درونی برخورد میکند، بهبود یافت. برای مثال، وقتی دو گروه وظیفه تودرتو هستند و هر دو همزمان در یک وظیفه فرزند دچار استثنا میشوند، ممکن بود گروه وظیفه بیرونی معلق بماند، زیرا لغو درونی آن توسط گروه وظیفه درونی بلعیده میشد.
در حالتی که یک گروه وظیفه از بیرون لغو شود و همچنین باید یک ExceptionGroup را raise کند، اکنون متد cancel() وظیفهی والد را فراخوانی میکند. این تضمین میکند که یک CancelledError در await بعدی raise خواهد شد، تا لغو شدن از دست نرود.
یک مزیت اضافی این تغییرات این است که گروههای وظیفه اکنون شمارش لغو را حفظ میکنند (cancelling()).
برای مدیریت برخی حالتهای خاص، uncancel() اکنون ممکن است پرچم غیرمستند _must_cancel را هنگامی که شمارش لغو به صفر برسد، بازنشانی کند.
(با الهام از مسئلهای که Arthur Tacca در gh-116720 گزارش کرده است.)
وقتی TaskGroup.create_task() روی یک TaskGroup غیرفعال فراخوانی شود، همروال دادهشده بسته میشود (که از یک RuntimeWarning دربارهی این که همروال دادهشده هرگز await نشده است، جلوگیری میکند). (با مشارکت آرتور تاکا و جیسون ژانگ در gh-115957.)
تابع و متدهای create_task آرگومان جدید **kwargs را دریافت کردهاند که به سازندهی وظیفه پاس داده میشود. این تغییر بهطور تصادفی در نسخهی 3.13.3 اضافه شد و قرارداد API را برای کارخانههای وظیفهی سفارشی نقض کرد. چندین کارخانهی وظیفهی شخص ثالث برای این موضوع راهحلهای موقت پیادهسازی کردند. در نسخهی 3.13.4 و نسخههای بعدی، قرارداد قدیمی کارخانه دوباره رعایت میشود (تا نسخهی 3.14). برای اینکه راهحلهای موقت همچنان کار کنند، آرگومان اضافی **kwargs همچنان اجازه میدهد آرگومانهای کلیدواژهای اضافی به Task و به کارخانههای وظیفهی سفارشی پاس داده شوند.
این بر تابع و متدهای زیر تأثیر میگذارد: asyncio.create_task()، asyncio.loop.create_task()، asyncio.TaskGroup.create_task(). (مشارکت از Thomas Grainger در gh-128307.)
copy¶
تابع جدید replace() و پروتکل replace ساخت کپیهای تغییریافته از اشیاء را بسیار سادهتر میکنند. این بهویژه هنگام کار با اشیاء تغییرناپذیر مفید است. انواع زیر از تابع replace() پشتیبانی میکنند و پروتکل replace را پیادهسازی میکنند:
هر کلاس تعریفشده توسط کاربر نیز میتواند با تعریف متد __replace__() از copy.replace() پشتیبانی کند. (مشارکتشده توسط Serhiy Storchaka در gh-108751.)
ctypes¶
در نتیجهی بازآرایی داخلی ضروری، مقداردهی اولیه فراکلاسهای داخلی اکنون در __init__ انجام میشود، نه در __new__. این موضوع بر پروژههایی تأثیر میگذارد که برای فراهم کردن مقداردهی اولیه سفارشی، از این فراکلاسهای داخلی زیرکلاس میسازند. بهطور کلی:
برای بحث و پیوندهایی به تغییرات در برخی پروژههای متأثر، gh-124520 را ببینید.
اشیاء ctypes.Structure یک ویژگی جدید _align_ دارند که به شما امکان میدهد ترازبندی ساختار هنگام بستهبندی/واگشایی آن به/از حافظه را بهطور صریح مشخص کنید. (مشارکتشده توسط مت سندرسون در gh-112433)
dbm¶
افزودن dbm.sqlite3، ماژول جدیدی که یک بکاند SQLite را پیادهسازی میکند، و قرار دادن آن بهعنوان بکاند پیشفرض dbm. (مشارکت توسط Raymond Hettinger و Erlend E. Aasland در gh-100414.)
امکان حذف تمام آیتمهای پایگاه داده از طریق متدهای جدید clear() در اشیای پایگاه دادهی GDBM و NDBM فراهم شد. (با مشارکت Donghee Na در gh-107122.)
dis¶
خروجی توابع ماژول dis تغییر کرده است تا بهجای آفستها، برچسبهای منطقی برای مقصدهای پرش (jump targets) و هندلرهای استثنا را نمایش دهد. آفستها را میتوان با گزینهی جدید خط فرمان -O یا آرگومان show_offsets اضافه کرد. (مشارکتشده توسط ایریت کاتریل در gh-112137.)
get_instructions() دیگر ورودیهای نهانگاه را بهصورت دستورهای جداگانه بازنمایی نمیکند. در عوض، آنها را بهعنوان بخشی از کلاس Instruction، در فیلد جدید cache_info برمیگرداند. آرگومان show_caches در get_instructions() منسوخ شده است و دیگر هیچ اثری ندارد. (مشارکتشده توسط ایریت کاتریل در gh-112962.)
email¶
سرآیندهای دارای سطرهای جدید تعبیهشده اکنون در خروجی داخل علامت نقلقول قرار میگیرند. generator اکنون از سریالسازی (نوشتن) سرآیندهایی که به شکل نامناسب تا شده یا جداسازی شدهاند و در نتیجه بهعنوان چندین سرآیند تجزیه میشوند یا به دادههای مجاور میپیوندند، خودداری میکند. اگر نیاز دارید این ویژگی ایمنی را غیرفعال کنید، مقدار verify_generated_headers را تنظیم کنید. (مشارکتشده توسط Bas Bloemsaat و Petr Viktorin در gh-121650.)
توابع getaddresses() و parseaddr() اکنون در موقعیتهای بیشتری که با نشانیهای ایمیل نامعتبر مواجه میشوند، بهجای مقادیری که ممکن است نادرست باشند، جفتهای ('', '') برمیگردانند. این دو تابع یک پارامتر اختیاری جدید به نام strict دارند (پیشفرض True). برای بهدستآوردن رفتار قدیمی (پذیرش ورودی بدشکل)، از strict=False استفاده کنید. میتوان از getattr(email.utils, 'supports_strict_parsing', False) برای بررسی موجود بودن پارامتر strict استفاده کرد. (مشارکتشده توسط Thomas Dwyer و Victor Stinner برای gh-102988 بهمنظور بهبود رفع مشکل CVE 2023-27043.)
importlib¶
توابع زیر در importlib.resources اکنون با استفاده از چندین آرگومان جایگاهی، امکان دسترسی به یک پوشه (یا درخت) از منابع را میدهند (آرگومانهای encoding و errors در توابع خواندن متن، اکنون فقط کلیدواژهای هستند):
این توابع دیگر منسوخ نیستند و برای حذف برنامهریزی نشدهاند. (مشارکتشده توسط Petr Viktorin در gh-116608.)
contents() همچنان به نفع API با امکانات کامل Traversable منسوخ است. با این حال، اکنون هیچ برنامهای برای حذف آن وجود ندارد. (مشارکتشده توسط Petr Viktorin در gh-116608.)
mmap¶
mmap اکنون در ویندوز در برابر فروپاشی محافظت میشود، وقتی حافظهی نگاشتشده به دلیل خطاهای سامانه فایلبندی یا نقض دسترسی در دسترس نباشد. (مشارکتشده توسط یانیس وایگند در gh-118209.)
mmap یک متد جدید seekable() دارد که میتوان از آن زمانی استفاده کرد که به یک شیء شبهپروندهی مکانیابیپذیر نیاز باشد. متد seek() اکنون موقعیت مطلق جدید را برمیگرداند. (مشارکتشده توسط Donghee Na و Sylvie Liberman در gh-111835.)
پارامتر جدید trackfd (فقط برای یونیکس) در mmap تکثیر توصیفگر پرونده را کنترل میکند؛ اگر نادرست باشد، توصیفگر پروندهای که توسط fileno مشخص شده است تکثیر نخواهد شد. (با مشارکت Zackery Spytz و Petr Viktorin در gh-78502.)
os.path¶
افزودن isreserved() برای بررسی اینکه آیا مسیری در سیستم فعلی رزروشده است. این تابع فقط در ویندوز دسترسپذیر است. (مشارکتشده توسط Barney Gale در gh-88569.)
در ویندوز، isabs() دیگر مسیرهایی که دقیقاً با یک اسلش (\ یا /) شروع میشوند را مطلق در نظر نمیگیرد. (مشارکتشده توسط بارنی گیل و جان فاستر در gh-44626.)
realpath() اکنون حتی اگر پرونده دسترسپذیر نباشد، نامهای پرونده به سبک MS-DOS را حل میکند. (مشارکتشده توسط Moonsik Park در gh-82367.)
pdb¶
breakpoint() و set_trace() اکنون بلافاصله وارد اشکالزدا میشوند، نه در سطر بعدی کدی که باید اجرا شود. این تغییر باعث میشود اشکالزدا هنگامی که breakpoint() در انتهای زمینه قرار گرفته باشد، خارج از زمینه توقف نکند. (مشارکتشده توسط Tian Gao در gh-118579.)
sys.path[0] هنگامی که sys.flags.safe_path تنظیم شده باشد، دیگر با پوشهی اسکریپتی که در حال اشکالزدایی است جایگزین نمیشود. (مشارکتشده توسط Tian Gao و Christian Walther در gh-111762.)
zipapp اکنون بهعنوان هدف اشکالزدایی پشتیبانی میشود. (مشارکتشده توسط Tian Gao در gh-118501.)
امکان جابهجایی بین استثناهای زنجیرهای هنگام اشکالزدایی پس از خاتمه در pm() با استفاده از دستور جدید exceptions [exc_number] برای Pdb اضافه شد. (مشارکتشده توسط Matthias Bussonnier در gh-106676.)
عبارتها و دستورهایی که پیشوندشان یک فرمان pdb است، اکنون بهدرستی شناسایی و اجرا میشوند. (مشارکت Tian Gao در gh-108464.)
statistics¶
kde() برای برآورد چگالی هستهای افزوده شد. این کار امکان برآورد یک تابع چگالی احتمال پیوسته از روی تعداد ثابتی نمونهی گسسته را فراهم میکند. (با مشارکت Raymond Hettinger در gh-115863.)
افزودن kde_random() برای نمونهگیری از یک تابع چگالی احتمال برآوردشده که توسط kde() ایجاد شده است. (مشارکتشده توسط Raymond Hettinger در gh-115863.)
subprocess¶
ماژول subprocess اکنون در موقعیتهای بیشتر از تابع posix_spawn() استفاده میکند.
شایان ذکر است که وقتی close_fds برابر True باشد (پیشفرض)، در صورتی که کتابخانهی C تابع posix_spawn_file_actions_addclosefrom_np() را ارائه کند، از posix_spawn() استفاده خواهد شد؛ این تابع در نسخههای اخیر لینوکس، FreeBSD و Solaris موجود است. در لینوکس، این باید مشابه کد مبتنی بر vfork() موجود در لینوکس عمل کند.
در صورتی که نیاز داشته باشید subprocess را مجبور کنید که هرگز از posix_spawn() استفاده نکند، میتوانید یک تنظیمکنندهی کنترلی خصوصی به نام subprocess._USE_POSIX_SPAWN را روی False قرار دهید. لطفاً در صورت تنظیم این مورد، دلیل و جزئیات پلتفرم خود را در issue tracker گزارش دهید تا بتوانیم منطق انتخاب API خود را برای همه بهبود ببخشیم. (مشارکتشده توسط یاکوب کولیک در gh-113117.)
time¶
در ویندوز، monotonic() اکنون از ساعت QueryPerformanceCounter() با وضوح ۱ میکروثانیه استفاده میکند، بهجای ساعت GetTickCount64() که وضوح آن ۱۵٫۶ میلیثانیه است. (مشارکتشده توسط Victor Stinner در gh-88494.)
در ویندوز، time() اکنون از ساعت GetSystemTimePreciseAsFileTime() با وضوح ۱ میکروثانیه استفاده میکند، بهجای ساعت GetSystemTimeAsFileTime() که وضوح ۱۵٫۶ میلیثانیه دارد. (مشارکتشده توسط Victor Stinner در gh-63207.)
tkinter¶
افزودن متدهای ابزارک tkinter: tk_busy_hold()، tk_busy_configure()، tk_busy_cget()، tk_busy_forget()، tk_busy_current() و tk_busy_status(). (مشارکت Miguel، klappnase و Serhiy Storchaka در gh-72684.)
متد ابزارک tkinter به نام wm_attributes() اکنون نام ویژگی را بدون پیشوند منفی برای دریافت ویژگیهای پنجره میپذیرد، برای مثال w.wm_attributes('alpha')، و به شما اجازه میدهد ویژگیها و مقادیری را که باید تنظیم شوند، بهصورت آرگومانهای کلیدواژهای مشخص کنید، برای مثال w.wm_attributes(alpha=0.5). (مشارکتشده توسط Serhiy Storchaka در gh-43457.)
wm_attributes() اکنون میتواند ویژگیها را با استفاده از پارامتر جدید و اختیاریِ فقطکلیدواژهای return_python_dict، بهصورت یک dict بازگرداند. (مشارکتشده توسط Serhiy Storchaka در gh-43457.)
Text.count() اکنون میتواند هنگام استفاده از پارامتر جدید فقطکلیدواژهای و اختیاری return_ints، یک int ساده برگرداند. در غیر این صورت، تعداد به صورت یک تاپل تکعضوی یا None برگردانده میشود. (مشارکتشده توسط Serhiy Storchaka در gh-97928.)
پشتیبانی از نوع المان "vsapi" در متد element_create() از کلاس tkinter.ttk.Style. (مشارکتشده توسط Serhiy Storchaka در gh-68166.)
افزودن متد after_info() برای ابزارکهای Tkinter. (مشارکتشده توسط Cheryl Sabella در gh-77020.)
متد جدید copy_replace() به PhotoImage اضافه شد تا ناحیهای را از یک تصویر به تصویری دیگر، با امکان بزرگنمایی پیکسلی، زیرنمونهگیری (subsampling) یا هر دو، کپی کند. (مشارکتشده توسط Serhiy Storchaka در gh-118225.)
افزودن پارامتر from_coords به متدهای copy()، zoom() و subsample() از PhotoImage. افزودن پارامترهای zoom و subsample به متد copy() از PhotoImage. (مشارکتشده توسط Serhiy Storchaka در gh-118225.)
متدهای read() برای خواندن تصویر از یک پرونده و data() برای دریافت دادههای تصویر به کلاس PhotoImage اضافه شدند. پارامترهای background و grayscale به متد write() اضافه شدند. (مشارکتشده توسط Serhiy Storchaka در gh-118271.)
xml¶
امکان کنترل تعویق بازتجزیه (reparse deferral) در Expat >=2.6.0 (CVE 2023-52425) با افزودن پنج متد جدید فراهم شد:
(مشارکت Sebastian Pipping در gh-115623.)
متد close() برای پاکسازی صریح به پیمایشگری که توسط iterparse() بازگردانده میشود، افزوده شد. (مشارکت Serhiy Storchaka در gh-69893.)
بهینهسازیها¶
زمان ایمپورت چندین ماژول از کتابخانه استاندارد بهطور چشمگیری بهبود یافته است. برای مثال، زمان ایمپورت ماژول typing با حذف وابستگیهای آن به re و contextlib حدود یکسوم کاهش یافته است. ماژولهای دیگری که از افزایش سرعت زمان ایمپورت بهرهمند شدهاند عبارتاند از email.utils، enum، functools، importlib.metadata و threading. (مشارکتشده توسط Alex Waygood، Shantanu Jain، Adam Turner، Daniel Hollas و دیگران در gh-109653.)
textwrap.indent() اکنون برای ورودیهای بزرگ حدود ۳۰ درصد سریعتر از قبل است. (مشارکتشده توسط Inada Naoki در gh-107369.)
ماژول subprocess اکنون در موقعیتهای بیشتری از تابع posix_spawn() استفاده میکند، از جمله زمانی که close_fds در بسیاری از پلتفرمهای مدرن برابر True (مقدار پیشفرض) است. این امر باید هنگام راهاندازی فرایندها روی FreeBSD و Solaris، افزایش عملکرد قابل توجهی به همراه داشته باشد. برای جزئیات، به بخش subprocess در بالا مراجعه کنید. (مشارکتشده توسط Jakub Kulik در gh-113117.)
ماژولها و APIهای حذفشده¶
PEP 594: حذف «باتریهای مرده» از کتابخانه استاندارد¶
PEP 594 حذف ۱۹ ماژول از کتابخانه استاندارد را پیشنهاد کرد؛ این ماژولها به دلیل تاریخی، از رده خارج یا ناامن بودن، بهطور محاورهای «باتریهای مرده» (dead batteries) نامیده میشوند. تمام ماژولهای زیر در پایتون 3.11 منسوخ شدند و اکنون حذف شدهاند:
aifc
audioop
chunk
cgi و cgitb
cgi.FieldStorage را معمولاً میتوان با urllib.parse.parse_qsl() برای درخواستهای GET و HEAD جایگزین کرد و برای درخواستهای POST و PUT با ماژول email.message یا کتابخانهی multipart.
cgi.parse() را میتوان با فراخوانی مستقیم urllib.parse.parse_qs() روی رشته پرسوجوی موردنظر جایگزین کرد، مگر آنکه ورودی multipart/form-data باشد، که در این صورت باید مطابق توضیح دادهشده در زیر برای cgi.parse_multipart() جایگزین شود.
cgi.parse_header() را میتوان با کارکرد موجود در بستهی email جایگزین کرد؛ این بسته همان RFCهای MIME را پیادهسازی میکند. برای مثال، با email.message.EmailMessage:
from email.message import EmailMessage
msg = EmailMessage()
msg['content-type'] = 'application/json; charset="utf8"'
main, params = msg.get_content_type(), msg['content-type'].params
cgi.parse_multipart() را میتوان با قابلیتهای موجود در بستهی email، که همان RFCهای MIME را پیادهسازی میکند، یا با کتابخانهی multipart جایگزین کرد. برای مثال، کلاسهای email.message.EmailMessage و email.message.Message.
standard-cgi: و standard-cgitb: از بازتوزیع کتابخانههای cgi و cgitb در PyPI استفاده کنید.
crypt و ماژول توسعهای خصوصی _crypt. ماژول hashlib ممکن است زمانی که صرفاً هشکردن یک مقدار مورد نیاز است، جایگزین مناسبی باشد. در غیر این صورت، کتابخانههای شخص ثالث گوناگونی در PyPI در دسترس هستند:
imghdr: باید از کتابخانههای filetype، puremagic یا python-magic بهعنوان جایگزین استفاده شود. برای مثال، تابع puremagic.what() میتواند برای همهی قالبهای پروندهای که توسط imghdr پشتیبانی میشدند، جایگزین تابع imghdr.what() شود.
mailcap: بهجای آن از ماژول mimetypes استفاده کنید.
msilib
nis
nntplib: به جای آن از کتابخانهی pynntp در PyPI استفاده کنید.
ossaudiodev: برای پخش صدا، بهجای آن از کتابخانهی pygame از PyPI استفاده کنید.
pipes: به جای آن از ماژول subprocess استفاده کنید. برای جایگزینی تابع مستندنشدهی pipes.quote از shlex.quote() استفاده کنید.
sndhdr: کتابخانههای filetype، puremagic یا python-magic باید بهعنوان جایگزین استفاده شوند.
spwd: بهجای آن، از کتابخانهی python-pam در PyPI استفاده کنید.
sunau
telnetlib، به جای آن از کتابخانههای telnetlib3 یا Exscript موجود در PyPI استفاده کنید.
uu: به جای آن، از ماژول base64 به عنوان یک جایگزین مدرن استفاده کنید.
xdrlib
(با مشارکت ویکتور استینر و زاکری ور در gh-104773 و gh-104780.)
builtins¶
پشتیبانی از توصیفگرهای زنجیرهای classmethod حذف شد (که در gh-63272 معرفی شده بودند). از این توصیفگرها دیگر نمیتوان برای دربرگرفتن توصیفگرهای دیگر، مانند property، استفاده کرد. طراحی اصلی این قابلیت معیوب بود و به چندین مشکل منجر شد. برای «عبور» (pass-through) از یک classmethod، استفاده از ویژگی __wrapped__ را در نظر بگیرید که در پایتون 3.10 افزوده شد. (مشارکتشده توسط Raymond Hettinger در gh-89519.)
هنگام فراخوانی frame.clear() بر روی یک فریم معلق، یک RuntimeError ایجاد میشود (همانطور که همیشه برای یک فریم در حال اجرا چنین بوده است). (مشارکت Irit Katriel در gh-79932.)
آپکد¶
opcode.ENABLE_SPECIALIZATION به _opcode.ENABLE_SPECIALIZATION منتقل شد. این فیلد در 3.12 افزوده شد، هرگز مستند نشد و برای استفادهی بیرونی در نظر گرفته نشده است. (مشارکتشده توسط Irit Katriel در gh-105481.)
حذف opcode.is_pseudo()، opcode.MIN_PSEUDO_OPCODE و opcode.MAX_PSEUDO_OPCODE که در پایتون 3.12 اضافهشده بودند، اما نه مستندشده بودند و نه از طریق dis در دسترس قرار گرفته بودند، و برای استفادهی خارجی در نظر گرفته نشده بودند. (مشارکتشده توسط Irit Katriel در gh-105481.)
typing¶
فضاهای نام typing.io و typing.re که از پایتون 3.8 منسوخ شده بودند، حذف شدند. آیتمهای موجود در آن فضاهای نام را میتوان مستقیماً از ماژول typing ایمپورت کرد. (مشارکتشده توسط سباستین ریتاو در gh-92871.)
روش ایجاد نوعهای TypedDict با آرگومانهای کلیدواژهای، که در پایتون 3.11 منسوخ شده بود، حذف شد. (مشارکت Tomas Roun در gh-104786.)
unittest¶
حذف توابع زیر از unittest که در پایتون 3.11 منسوخ شدهاند:
بهجای آن از متدهای TestLoader استفاده کنید:
(مشارکتشده توسط هوگو ون کمِناده در gh-104835.)
متد آزموننشده و بدون مستندات TestProgram.usageExit() که در پایتون 3.11 منسوخ شده بود، حذف شد. (مشارکت توسط Hugo van Kemenade در gh-104992.)
webbrowser¶
کلاس MacOSX که آزموننشده و مستندنشده بود و در پایتون 3.11 منسوخ شده بود، حذف شد. به جای آن، از کلاس MacOSXOSAScript (معرفیشده در پایتون 3.2) استفاده کنید. (مشارکتشده توسط Hugo van Kemenade در gh-104804.)
ویژگی منسوخ MacOSXOSAScript._name حذف شد. بهجای آن از ویژگی MacOSXOSAScript.name استفاده کنید. (مشارکتشده توسط نیکیتا سوبولف در gh-105546.)
منسوخشدگیهای جدید¶
در پایتون 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 از عملیات کپی، deepcopy و پیکل پشتیبانی مستندنشده، ناکارآمد، بهطور تاریخی دارای اشکال و ناسازگار داشت. این پشتیبانی در نسخهی 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¶
در پایتون 3.16 در انتظار حذف است¶
در انتظار حذف در پایتون 3.17¶
datetime:
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.)
encodings:
profile:
webbrowser:
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.)
tkinter:
در انتظار حذف در پایتون 3.18¶
هنگامی که انتظار یک توصیفگر پرونده میرود، دیگر مقدار بولی پذیرفته نمیشود. (مشارکتی از Serhiy Storchaka در gh-82626.)
decimal:
موارد منسوخشده تعریفشده توسط PEP 829:
(مشارکتی از Barry Warsaw در gh-148641.)
در انتظار حذف در پایتون 3.19¶
ctypes:
hashlib:
در سازندهای تابع هش مانند new() یا سازندهای مستقیم دارای نام هش مانند md5() و sha256()، در پیادهسازیهای مختلف hashlib امکان ارسال یک آرگومان کلیدواژهای با نام data= یا string= نیز به پارامتر دادهی اولیه اختیاری آنها وجود داشت.
پشتیبانی از نام آرگومان کلیدواژهای string اکنون منسوخ شده و قرار است در نسخهی ۳.۱۹ پایتون حذف شود.
پیش از پایتون ۳.۱۳، پارامتر کلیدواژهای string بسته به پیادهسازی بکاند عملکردهای هش به شکل درستی پشتیبانی نمیشد. برای حداکثر سازگاری با نسخههای قبلی، ترجیح دهید دادهی اولیه را به عنوان یک آرگومان جایگاهی ارسال کنید.
http.cookies:
imaplib:
تغییر دادن IMAP4.file اکنون منسوخ شده است و برنامهریزی شده تا در پایتون ۳.۱۹ حذف شود. این ویژگی اکنون استفاده نمیشود و تغییر مقدار آن پروندهی فعلی را به طور خودکار نمیبندد.
پیش از پایتون ۳.۱۴، از این ویژگی برای پیادهسازی متدهای متناظر read() و readline() برای IMAP4 استفاده میشد، اما از آن زمان به بعد دیگر اینطور نیست.
حذف در نسخهی ۳.۲۰ پایتون در راه است¶
فراخوانی متد __new__() از struct.Struct بدون آرگومان format منسوخ شده است و در پایتون ۳.۲۰ حذف خواهد شد. فراخوانی متد __init__() روی شیءهای مقداردهی اولیهشدهی Struct منسوخ شده است و در پایتون ۳.۲۰ حذف خواهد شد.
(مشارکتکرده توسط Sergey B Kirpichev و Serhiy Storchaka در gh-143715.)
ویژگیهای __version__، version و VERSION در این ماژولهای کتابخانهی استاندارد منسوخ شدهاند و در پایتون ۳.۲۰ حذف خواهند شد. بهجای آنها از sys.version_info استفاده کنید.
(مشارکتکرده توسط Hugo van Kemenade و Stan Ulbrych در gh-76007.)
موارد منسوخشده تعریفشده توسط PEP 829:
(مشارکتی از Barry Warsaw در gh-148641.)
ast:
typing:
فراخوانی بررسیهای isinstance() و issubclass() روی کلاسهای پروتکلی که به طور صریح با runtime_checkable() دکوریت نشدهاند اما از یک کلاس پروتکل با قابلیت بررسی در زمان اجرا ارثبری میکنند، منسوخ شده است. این کار در پایتون ۳.۲۰ یک خطای TypeError ایجاد خواهد کرد.
(مشارکتکرده توسط Bartosz Sławecki در gh-132604.)
در انتظار حذف در نسخههای آینده¶
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:
importlib.metadata:
logging: متد warn() از پایتون 3.3 منسوخ شده است، بهجای آن از warning() استفاده کنید.
mailbox: استفاده از ورودی StringIO و حالت متنی منسوخ شده است؛ به جای آن از BytesIO و حالت دودویی استفاده کنید.
os: فراخوانی os.register_at_fork() در یک فرایند چندنخی.
os.path: تابع os.path.commonprefix() منسوخ شده است، برای پیشوندهای مسیر از os.path.commonpath() استفاده کنید. تابع os.path.commonprefix() به دلیل داشتن نام و ماژول گمراهکننده در حال منسوخ شدن است. این تابع با وجود اینکه در ماژولی دربارهی دستکاری مسیر گنجانده شده است، برای استفاده در پیشوندهای مسیر ایمن نیست، به این معنا که با استفاده از این تابع میتوان بهطور تصادفی آسیبپذیریهای پیمایش مسیر را به برنامههای پایتون تزریق کرد.
pydoc.ErrorDuringImport: مقدار تاپل برای پارامتر exc_info منسوخ شده است؛ از یک نمونه استثنا استفاده کنید.
re: اکنون قواعد سختگیرانهتری برای ارجاعهای عددی به گروهها و نام گروهها در عبارات باقاعده اعمال میشود. اکنون فقط دنبالهای از ارقام اسکی بهعنوان ارجاع عددی پذیرفته میشود. نام گروه در الگوهای بایتی و رشتههای جایگزین اکنون فقط میتواند شامل حروف و ارقام اسکی و زیرخط باشد. (مشارکتشده توسط Serhiy Storchaka در gh-91760.)
shutil: پارامتر onerror در rmtree() در پایتون 3.12 منسوخ شده است؛ به جای آن از پارامتر onexc استفاده کنید.
گزینهها و پروتکلهای ssl:
متدهای threading:
typing.Text (gh-92332).
کلاس داخلی typing._UnionGenericAlias دیگر برای پیادهسازی typing.Union استفاده نمیشود. برای حفظ سازگاری با کاربرانی که از این کلاس خصوصی استفاده میکنند، یک شیم سازگاری (compatibility 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() نباید نوشتن ناقص (partial write) انجام دهد.
xml.etree.ElementTree: آزمودن ارزش صدق یک Element منسوخ شده است. در نسخهای در آینده، این آزمون همیشه True را برمیگرداند. بهجای آن، آزمونهای صریح len(elem) یا elem is not None را ترجیح دهید.
sys._clear_type_cache() منسوخ شده است: به جای آن از sys._clear_internal_caches() استفاده کنید.
تغییرات بایتکد سیپایتون¶
تغییرات API زبان C¶
APIهای C حذفشده¶
چندین تابع، ماکرو، متغیر و غیره با نامهایی که پیشوند _Py یا _PY دارند (که خصوصی محسوب میشوند) حذف شدند. اگر پروژهی شما تحت تأثیر یکی از این حذفها قرار میگیرد و معتقدید که API حذفشده باید در دسترس باقی بماند، لطفاً برای درخواست یک C API عمومی، یک مسئله جدید باز کنید و cc: @vstinner را به مسئله اضافه کنید تا Victor Stinner مطلع شود. (مشارکتشده توسط Victor Stinner در gh-106320.)
پروتکلهای بافر قدیمی که در پایتون 3.0 منسوخ شده بودند، حذف شدند. به جای آنها از پروتکل بافر استفاده کنید.
PyObject_CheckReadBuffer(): برای بررسی اینکه آیا شیء از پروتکل بافر پشتیبانی میکند، از PyObject_CheckBuffer() استفاده کنید. توجه داشته باشید که PyObject_CheckBuffer() تضمین نمیکند که PyObject_GetBuffer() با موفقیت انجام شود. برای بررسی اینکه آیا شیء واقعاً قابل خواندن است، به مثال بعدی از PyObject_GetBuffer() مراجعه کنید.
PyObject_AsCharBuffer()، PyObject_AsReadBuffer(): بهجای آنها از PyObject_GetBuffer() و PyBuffer_Release() استفاده کنید:
Py_buffer view;
if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) {
return NULL;
}
// برای خواندن از بافر، از `view.buf` و `view.len` استفاده کنید.
// ممکن است لازم باشد buf را بهصورت `(const char*)view.buf` قالبریزی کنید.
PyBuffer_Release(&view);
PyObject_AsWriteBuffer(): بهجای آن از PyObject_GetBuffer() و PyBuffer_Release() استفاده کنید:
Py_buffer view;
if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) {
return NULL;
}
// برای نوشتن در بافر، از `view.buf` و `view.len` استفاده کنید.
PyBuffer_Release(&view);
(مشارکتشده توسط Inada Naoki در gh-85275.)
حذف توابع مختلفی که در پایتون 3.9 منسوخ شدهاند:
PyEval_CallObject()، PyEval_CallObjectWithKeywords(): به جای آنها از PyObject_CallNoArgs() یا PyObject_Call() استفاده کنید.
هشدار
در PyObject_Call()، آرگومانهای جایگاهی باید یک tuple باشند و نباید NULL باشند، و آرگومانهای کلیدواژهای باید یک dict یا NULL باشند؛ در حالی که توابع حذفشده نوع آرگومانها را بررسی میکردند و آرگومانهای جایگاهی و کلیدواژهای NULL را میپذیرفتند. برای جایگزینی PyEval_CallObjectWithKeywords(func, NULL, kwargs) با PyObject_Call()، یک تاپل خالی را بهعنوان آرگومانهای جایگاهی با استفاده از PyTuple_New(0) ارسال کنید.
PyEval_CallFunction(): بهجای آن از PyObject_CallFunction() استفاده کنید.
PyEval_CallMethod(): به جای آن از PyObject_CallMethod() استفاده کنید.
PyCFunction_Call(): به جای آن از PyObject_Call() استفاده کنید.
(مشارکتشده توسط Victor Stinner در gh-105107.)
توابع قدیمی زیر برای پیکربندی مقداردهی اولیه پایتون، که در پایتون 3.11 منسوخ شده بودند، حذف شدند:
بهجای آن از API جدید PyConfig در پیکربندی مقداردهی اولیه پایتون استفاده کنید (PEP 587)، که در پایتون 3.8 اضافه شد. (مشارکت Victor Stinner در gh-105145.)
توابع PyEval_AcquireLock() و PyEval_ReleaseLock() که در پایتون 3.2 منسوخ شده بودند، حذف شدند. این توابع وضعیت نخ جاری را بهروزرسانی نمیکردند. میتوان آنها را با موارد زیر جایگزین کرد:
(مشارکتشده توسط ویکتور استینر در gh-105182.)
تابع PyEval_ThreadsInitialized() که در پایتون 3.9 منسوخ شده بود، حذف شد. از پایتون 3.7 به بعد، Py_Initialize() همیشه قفل مفسر سراسری را ایجاد میکند: فراخوانی PyEval_InitThreads() هیچ کاری انجام نمیدهد و PyEval_ThreadsInitialized() همیشه مقدار غیرصفر برمیگرداند. (با مشارکت Victor Stinner در gh-105182.)
نام مستعار _PyInterpreterState_Get() برای PyInterpreterState_Get() که برای حفظ سازگاری با نسخههای قبلی پایتون 3.8 نگه داشته شده بود، حذف شد. میتوان از pythoncapi-compat project برای دریافت PyInterpreterState_Get() در پایتون 3.8 و نسخههای قدیمیتر استفاده کرد. (مشارکتشده توسط Victor Stinner در gh-106320.)
تابع خصوصی _PyObject_FastCall() حذف شد: از PyObject_Vectorcall() استفاده کنید که از پایتون 3.8 به بعد در دسترس است (PEP 590). (مشارکتشده توسط Victor Stinner در gh-106023.)
پروندهی سرآیند cpython/pytime.h که تنها شامل توابع خصوصی بود، حذف شد. (مشارکتشده توسط Victor Stinner در gh-106316.)
ثابت مستندنشدهی PY_TIMEOUT_MAX از C API محدود حذف شد. (با مشارکت Victor Stinner در gh-110014.)
ماکروهای قدیمی سطل زباله (trashcan) Py_TRASHCAN_SAFE_BEGIN و Py_TRASHCAN_SAFE_END حذف شدند. هر دو با ماکروهای جدید Py_TRASHCAN_BEGIN و Py_TRASHCAN_END جایگزین شدند. (با مشارکت ایریت کاتریل در gh-105111.)
APIهای منسوخ C¶
در پایتون 3.14 حذف خواهد شد¶
در انتظار حذف در پایتون 3.15¶
تابع PyImport_ImportModuleNoBlock(): بهجای آن از PyImport_ImportModule() استفاده کنید.
PyWeakref_GetObject() و PyWeakref_GET_OBJECT(): بهجای آنها از PyWeakref_GetRef() استفاده کنید. برای دریافت PyWeakref_GetRef() در نسخهی ۳.۱۲ پایتون و نسخههای قدیمیتر، میتوانید از پروژهی pythoncapi-compat project استفاده کنید.
PyUnicode_AsDecodedObject(): به جای آن از PyCodec_Decode() استفاده کنید.
PyUnicode_AsDecodedUnicode(): بهجای آن از PyCodec_Decode() استفاده کنید؛ توجه داشته باشید که برخی کدکها (برای مثال، «base64») ممکن است نوعی غیر از str، مانند bytes، برگردانند.
PyUnicode_AsEncodedObject(): بهجای آن از PyCodec_Encode() استفاده کنید.
PyUnicode_AsEncodedUnicode(): بهجای آن از PyCodec_Encode() استفاده کنید؛ توجه داشته باشید که برخی کدکها (مثلاً "base64") ممکن است نوعی غیر از bytes، مانند str، برگردانند.
توابع مقداردهی اولیه پایتون، منسوخشده در پایتون 3.13:
میتوان از پروژهی pythoncapi-compat برای بهدست آوردن PyConfig_Get() در پایتون 3.13 و قدیمیتر استفاده کرد.
توابعی برای پیکربندی راهاندازی پایتون، که در پایتون 3.11 منسوخ شدهاند:
بهجای آن، باید از API Py_InitializeFromConfig() همراه با PyConfig استفاده کرد.
متغیرهای پیکربندی سراسری:
برای تنظیم این گزینهها باید از API Py_InitializeFromConfig() همراه با PyConfig استفاده کرد. یا میتوان از PyConfig_Get() برای دریافت این گزینهها در رانتایم استفاده کرد.
در پایتون 3.16 در انتظار حذف است¶
در انتظار حذف در پایتون 3.18¶
توابع خصوصی زیر منسوخ شدهاند و حذف آنها در Python 3.18 برنامهریزی شده است:
_PyBytes_Join(): از PyBytes_Join() استفاده کنید.
_PyDict_GetItemStringWithError(): از PyDict_GetItemStringRef() استفاده کنید.
_PyDict_Pop(): از PyDict_Pop() استفاده کنید.
_PyLong_Sign(): از PyLong_GetSign() استفاده کنید.
_PyLong_FromDigits() و _PyLong_New(): از PyLongWriter_Create() استفاده کنید.
_PyThreadState_UncheckedGet(): از PyThreadState_GetUnchecked() استفاده کنید.
_PyUnicode_AsString(): از PyUnicode_AsUTF8() استفاده کنید.
_PyUnicodeWriter_Init(): _PyUnicodeWriter_Init(&writer) را با writer = PyUnicodeWriter_Create(0) جایگزین کنید.
_PyUnicodeWriter_Finish(): _PyUnicodeWriter_Finish(&writer) را با PyUnicodeWriter_Finish(writer) جایگزین کنید.
_PyUnicodeWriter_Dealloc(): _PyUnicodeWriter_Dealloc(&writer) را با PyUnicodeWriter_Discard(writer) جایگزین کنید.
_PyUnicodeWriter_WriteChar(): _PyUnicodeWriter_WriteChar(&writer, ch) را با PyUnicodeWriter_WriteChar(writer, ch) جایگزین کنید.
_PyUnicodeWriter_WriteStr(): _PyUnicodeWriter_WriteStr(&writer, str) را با PyUnicodeWriter_WriteStr(writer, str) جایگزین کنید.
_PyUnicodeWriter_WriteSubstring(): _PyUnicodeWriter_WriteSubstring(&writer, str, start, end) را با PyUnicodeWriter_WriteSubstring(writer, str, start, end) جایگزین کنید.
_PyUnicodeWriter_WriteASCIIString(): عبارت _PyUnicodeWriter_WriteASCIIString(&writer, str) را با PyUnicodeWriter_WriteASCII(writer, str) جایگزین کنید.
_PyUnicodeWriter_WriteLatin1String(): عبارت _PyUnicodeWriter_WriteLatin1String(&writer, str) را با PyUnicodeWriter_WriteUTF8(writer, str) جایگزین کنید.
_PyUnicodeWriter_Prepare(): (بدون جایگزین).
_PyUnicodeWriter_PrepareKind(): (بدون جایگزین).
_Py_HashPointer(): از Py_HashPointer() استفاده کنید.
_Py_fopen_obj(): از Py_fopen() استفاده کنید.
میتوان از پروژهی pythoncapi-compat برای دریافت این توابع عمومی جدید در پایتون 3.13 و نسخههای قدیمیتر استفاده کرد. (مشارکتشده توسط Victor Stinner در gh-128863.)
در انتظار حذف در نسخههای آینده¶
APIهای زیر منسوخ شدهاند و حذف خواهند شد، هرچند در حال حاضر تاریخی برای حذف آنها تعیین نشده است.
تغییرات ساخت¶
arm64-apple-ios و arm64-apple-ios-simulator هر دو اکنون طبق PEP 11 پلتفرمهای رده ۳ هستند. (PEP 730 نوشته شد و پیادهسازی آن توسط Russell Keith-Magee در gh-114099 ارائه شد.)
aarch64-linux-android و x86_64-linux-android هر دو اکنون پلتفرمهای رده ۳ بر اساس PEP 11 هستند. (PEP 738 نوشته شده و پیادهسازی آن توسط مالکوم اسمیت در gh-116622 ارائه شده است.)
wasm32-wasi اکنون یک پلتفرم سطح ۲ مطابق PEP 11 است. (با مشارکت Brett Cannon در gh-115192.)
wasm32-emscripten دیگر یک پلتفرم پشتیبانیشدهی PEP 11 نیست. (مشارکتشده توسط Brett Cannon در gh-115192.)
ساخت سیپایتون اکنون به کامپایلری نیاز دارد که از کتابخانه اتمی C11، توابع اتمی توکار GCC، یا توابع درونی interlocked در MSVC (interlocked intrinsics) پشتیبانی کند.
اکنون برای بازتولید اسکریپت configure به Autoconf 2.71 و aclocal 1.16.5 نیاز است. (مشارکتشده توسط Christian Heimes در gh-89886 و Victor Stinner در gh-112090.)
برای ساخت ماژول توسعهای sqlite3 به SQLite 3.15.2 یا جدیدتر نیاز است. (مشارکت Erlend Aasland در gh-105875.)
سیپایتون اکنون بهطور پیشفرض mimalloc library را به همراه دارد. این کتابخانه تحت مجوز MIT ارائه شده است؛ به مجوز mimalloc مراجعه کنید. نسخهی همراه mimalloc دارای تغییرات سفارشی است؛ برای جزئیات به gh-113141 مراجعه کنید. (مشارکتشده توسط Dino Viehland در gh-109914.)
گزینهی --with-system-libmpdec در configure اکنون بهطور پیشفرض yes است. نسخهی همراه libmpdec در پایتون 3.16 حذف خواهد شد.
پایتونی که با configure --with-trace-refs (ردگیری ارجاعها) ساخته میشود، اکنون از نظر رابط دودویی برنامه (ABI) با ساخت انتشار پایتون و ساخت اشکالزدایی سازگار است. (مشارکتشده توسط Victor Stinner در gh-108634.)
در سیستمهای POSIX، نام پروندههای pkg-config (.pc) اکنون شامل پرچمهای ABI هستند. برای مثال، ساخت نخآزاد python-3.13t.pc را تولید میکند و ساخت اشکالزدایی python-3.13d.pc را تولید میکند.
ماژولهای توسعه C یعنی errno، fcntl، grp، md5، pwd، resource، termios، winsound، _ctypes_test، _multiprocessing.posixshmem، _scproxy، _stat، _statistics، _testconsole، _testimportmultiple و _uuid اکنون با C API محدود ساخته میشوند. (با مشارکت Victor Stinner در gh-85283.)
انتقال به پایتون 3.13¶
این بخش، تغییرات پیشتر شرح دادهشده و سایر رفع اشکالهایی را که ممکن است نیازمند تغییراتی در کد شما باشند، فهرست میکند.
تغییرات در API پایتون¶
PEP 667 چندین تغییر را در معناشناسی locals() و f_locals معرفی میکند:
فراخوانی locals() در یک محدوده بهینهشده اکنون در هر فراخوانی یک تصویر لحظهای مستقل تولید میکند و در نتیجه دیگر ارجاعهای پیشتر بازگرداندهشده را بهطور ضمنی بهروزرسانی نمیکند. بهدستآوردن رفتار قدیمی سیپایتون اکنون مستلزم این است که با فراخوانیهای صریح، دیکشنریای که در ابتدا بازگردانده شده است با نتایج فراخوانیهای بعدی locals() بهروزرسانی شود. به توابع اجرای کد که بهطور ضمنی locals() را هدف میگیرند (مانند exec و eval) باید یک فضای نام صریح پاس داده شود تا بتوان در یک محدوده بهینهشده به نتایج آنها دسترسی داشت. (این تغییر بهعنوان بخشی از PEP 667 انجام شده است.)
فراخوانی locals() از یک درک در محدوده ماژول یا کلاس (از جمله از طریق exec یا eval) دوباره طوری رفتار میکند که گویی درک بهصورت یک تابع تودرتوی مستقل در حال اجراست (یعنی متغیرهای محلی محدوده دربرگیرنده گنجانده نمیشوند). در پایتون 3.12، این رفتار هنگام پیادهسازی PEP 709 به گونهای تغییر کرده بود که متغیرهای محلی محدوده دربرگیرنده را در بر بگیرد. (بهعنوان بخشی از PEP 667 تغییر کرد.)
دسترسی به FrameType.f_locals در یک محدوده بهینهشده اکنون یک پراکسی نوشتنهمزمان برمیگرداند، نه یک تصویر لحظهای که در زمانهای بهخوبی تعریفنشده بهروزرسانی میشود. در صورت نیاز به تصویر لحظهای، باید آن را بهطور صریح با dict یا متد .copy() پراکسی ایجاد کنید. (این تغییر بهعنوان بخشی از PEP 667 انجام شده است.)
functools.partial اکنون هنگامی که بهعنوان متد استفاده شود، یک FutureWarning منتشر میکند. این رفتار در نسخههای آینده پایتون تغییر خواهد کرد. اگر میخواهید رفتار قدیمی را حفظ کنید، آن را در staticmethod() بپیچید. (مشارکتشده توسط Serhiy Storchaka در gh-121027.)
اکنون OSError توسط getpass.getuser() در صورت هرگونه شکست در بازیابی نام کاربری ایجاد میشود، بهجای ImportError در پلتفرمهای غیر یونیکس یا KeyError در پلتفرمهای یونیکس که پایگاه داده رمز عبور در آنها خالی است.
مقدار ویژگی mode از gzip.GzipFile اکنون یک رشته ('rb' یا 'wb') است، بهجای یک عدد صحیح (1 یا 2). مقدار ویژگی mode از شیء شبهپروندهی خواندنی که توسط zipfile.ZipFile.open() بازگردانده میشود، اکنون 'rb' است، بهجای 'r'. (مشارکتشده توسط Serhiy Storchaka در gh-115961.)
mailbox.Maildir اکنون پروندههایی را که با نقطه (.) آغاز میشوند نادیده میگیرد. (با مشارکت Zackery Spytz در gh-65559.)
pathlib.Path.glob() و rglob() اکنون اگر الگویی که به «**» ختم میشود داده شود، هم پروندهها و هم پوشهها را برمیگردانند، نه فقط پوشهها. برای حفظ رفتار قبلی و تطبیق فقط با پوشهها، یک اسلش انتهایی اضافه کنید.
ماژول threading اکنون انتظار دارد که ماژول _thread تابع _is_main_interpreter() را داشته باشد. این تابع هیچ آرگومانی نمیگیرد و اگر مفسر فعلی، مفسر اصلی باشد، True برمیگرداند.
هر کتابخانه یا برنامهای که یک ماژول _thread سفارشی ارائه میدهد، باید _is_main_interpreter() را نیز فراهم کند، درست مانند سایر ویژگیهای «خصوصی» ماژول. (gh-112826.)
تغییرات در API زبان C¶
Python.h دیگر سرآیند استاندارد <ieeefp.h> را شامل نمیشود. این سرآیند برای تابع finite() گنجانده شده بود که اکنون توسط سرآیند <math.h> ارائه میشود. اکنون در صورت نیاز باید بهطور صریح گنجانده شود. ماکرو HAVE_IEEEFP_H را نیز حذف کنید. (مشارکت Victor Stinner در gh-108765.)
Python.h دیگر این پروندههای سرآیند استاندارد را شامل نمیشود: <time.h>، <sys/select.h> و <sys/time.h>. در صورت نیاز، اکنون باید بهطور صریح گنجانده شوند. برای مثال، <time.h> توابع clock() و gmtime() را فراهم میکند، <sys/select.h> تابع select() را فراهم میکند و <sys/time.h> توابع futimes()، gettimeofday() و setitimer() را فراهم میکند. (مشارکتشده توسط Victor Stinner در gh-108765.)
در ویندوز، Python.h دیگر شامل پروندهی سرآیند استاندارد <stddef.h> نیست. در صورت نیاز، اکنون باید بهصورت صریح گنجانده شود. برای مثال، این سرآیند تابع offsetof() و نوعهای size_t و ptrdiff_t را فراهم میکند. گنجاندن <stddef.h> بهصورت صریح از قبل برای همهی پلتفرمهای دیگر لازم بود؛ ماکروی HAVE_STDDEF_H فقط در ویندوز تعریف میشود. (مشارکتشده توسط Victor Stinner در gh-108765.)
اگر ماکروی Py_LIMITED_API تعریف شده باشد، ماکروهای Py_BUILD_CORE، Py_BUILD_CORE_BUILTIN و Py_BUILD_CORE_MODULE اکنون توسط <Python.h> تعریف نمیشوند. (مشارکتشده توسط Victor Stinner در gh-85283.)
ماکروهای قدیمی سطل زباله (trashcan) Py_TRASHCAN_SAFE_BEGIN و Py_TRASHCAN_SAFE_END حذف شدند. آنها باید با ماکروهای جدید Py_TRASHCAN_BEGIN و Py_TRASHCAN_END جایگزین شوند.
یک تابع tp_dealloc که ماکروهای قدیمی را دارد، مانند:
static void
mytype_dealloc(mytype *p)
{
PyObject_GC_UnTrack(p);
Py_TRASHCAN_SAFE_BEGIN(p);
...
Py_TRASHCAN_SAFE_END
}
باید به ماکروهای جدید به شرح زیر مهاجرت کنند:
static void
mytype_dealloc(mytype *p)
{
PyObject_GC_UnTrack(p);
Py_TRASHCAN_BEGIN(p, mytype_dealloc)
...
Py_TRASHCAN_END
}
توجه داشته باشید که Py_TRASHCAN_BEGIN آرگومان دومی دارد که باید همان تابع آزادسازی باشد که این ماکرو در آن قرار دارد. ماکروهای جدید در پایتون 3.8 اضافه شدند و ماکروهای قدیمی در پایتون 3.11 منسوخ شدند. (مشارکتشده توسط ایریت کاتریل در gh-105111.)
PEP 667 چندین تغییر در توابع مرتبط با فریم معرفی میکند:
اثرات تغییر دادن دیکشنری بازگرداندهشده از PyEval_GetLocals() در یک محدوده بهینهشده تغییر کردهاند. مدخلهای جدید دیکشنری که به این روش اضافه میشوند، اکنون تنها برای فراخوانیهای بعدی PyEval_GetLocals() در آن فریم قابل مشاهده خواهند بود، زیرا PyFrame_GetLocals()، locals() و FrameType.f_locals دیگر به همان دیکشنری نهانگاهشدهی زیرین دسترسی ندارند. تغییراتی که در مدخلهای مربوط به نامهای متغیرهای واقعی و نامهای افزودهشده از طریق رابطهای پراکسی نوشتنهمزمان اعمال میشوند، در فراخوانیهای بعدی PyEval_GetLocals() در آن فریم بازنویسی خواهند شد. بهروزرسانی توصیهشدهی کد به نحوهی استفاده از تابع بستگی دارد، بنابراین برای جزئیات به اطلاعیهی منسوخشدن تابع مراجعه کنید.
فراخوانی PyFrame_GetLocals() در محدوده بهینهشده اکنون بهجای یک تصویر لحظهای که در زمانهای نامشخص بهروزرسانی میشود، یک پراکسی نوشتنهمزمان برمیگرداند. اگر تصویر لحظهای مورد نیاز است، باید بهطور صریح ایجاد شود (مثلاً با PyDict_Copy())، یا با فراخوانی API جدید PyEval_GetFrameLocals().
PyFrame_FastToLocals() و PyFrame_FastToLocalsWithError() دیگر هیچ اثری ندارند. فراخوانی این توابع از زمان پایتون 3.11، زمانی که PyFrame_GetLocals() برای نخستین بار معرفی شد، زائد بوده است.
PyFrame_LocalsToFast() دیگر هیچ اثری ندارد. اکنون که PyFrame_GetLocals() برای محدودههای بهینهشده یک پراکسی نوشتنهمزمان برمیگرداند، فراخوانی این تابع زائد است.
پایتون 3.13 بسیاری از توابع خصوصی را حذف کرد. برخی از آنها را میتوان با استفاده از این جایگزینها جایگزین کرد:
میتوان از pythoncapi-compat project برای به دست آوردن بیشتر این توابع جدید در پایتون 3.12 و نسخههای قدیمیتر استفاده کرد.
تغییرات آزمونهای رگرسیون¶
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است.
مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند.
برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید.
بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است.
لطفاً کمک مالی کنید.
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا اشکالی یافتید؟
ساخته شده با Sphinx 9.1.0.
|