تازههای پایتون 3.11¶
- ویرایشگر:
Pablo Galindo Salgado
این مقاله ویژگیهای جدید پایتون 3.11 را در مقایسه با 3.10 توضیح میدهد. پایتون 3.11 در تاریخ ۲۴ اکتبر ۲۰۲۲ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید.
خلاصه -- نکات برجستهی انتشار¶
پایتون 3.11 بین ۱۰ تا ۶۰ درصد سریعتر از پایتون 3.10 است. بهطور میانگین، افزایش سرعت ۱٫۲۵ برابری را در بدنه بنچمارکهای استاندارد اندازهگیری کردیم. برای جزئیات به سیپایتون سریعتر (Faster CPython) مراجعه کنید.
ویژگیهای نحوی جدید:
قابلیتهای توکار جدید:
ماژولهای جدید کتابخانه استاندارد:
بهبودهای مفسر:
گزینهی جدید خط فرمان
-Pو متغیر محیطیPYTHONSAFEPATHبرای غیرفعال کردن افزودن خودکار مسیرهای بالقوه ناامن به ابتدایsys.path
قابلیتهای جدید نوعدهی:
منسوخسازیها، حذفها و محدودیتهای مهم:
PEP 594: بسیاری از ماژولهای قدیمی کتابخانه استاندارد منسوخ شدهاند و در پایتون 3.13 حذف خواهند شد
ویژگیهای جدید¶
PEP 657: مکانهای ریزدانهی خطا در ردگیریها¶
هنگام چاپ ردگیریها، مفسر از این پس به عبارت دقیقی که باعث خطا شده است اشاره خواهد کرد، نه فقط به سطر. برای مثال:
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
نسخههای قبلی مفسر فقط به سطر اشاره میکردند، که باعث میشد مبهم باشد کدام شیء None بوده است. این خطاهای بهبودیافته هنگام کار با اشیای dict بهشدت تودرتو و فراخوانیهای متعدد تابع نیز میتوانند مفید باشند:
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic('foo')
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
همچنین عبارتهای حسابی پیچیده:
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
علاوه بر این، اطلاعات مورد استفاده در قابلیت ردگیری بهبودیافته از طریق یک API عمومی در دسترس قرار گرفته است که میتوان از آن برای برقراری تناظر میان دستورالعملهای bytecode و مکان کد منبع استفاده کرد. این اطلاعات را میتوان با استفاده از موارد زیر بازیابی کرد:
متد
codeobject.co_positions()در پایتون.تابع
PyCode_Addr2Location()در API زبان C.
برای جزئیات بیشتر به PEP 657 مراجعه کنید. (مشارکتشده توسط Pablo Galindo، Batuhan Taskaya و Ammar Askar در bpo-43950.)
توجه
این قابلیت نیازمند ذخیرهسازی موقعیتهای ستون در اشیاء کد است که ممکن است به افزایش اندکی در مصرف حافظهی مفسر و مصرف دیسک برای پروندههای کامپایلشدهی پایتون منجر شود. برای پرهیز از ذخیرهسازی اطلاعات اضافی و غیرفعال کردن چاپ اطلاعات ردگیری اضافی، از گزینهی خط فرمان -X no_debug_ranges یا متغیر محیطی PYTHONNODEBUGRANGES استفاده کنید.
PEP 654: گروههای استثنا و except*¶
PEP 654 ویژگیهایی زبانی معرفی میکند که به یک برنامه امکان میدهد تا چندین استثنای نامرتبط را بهطور همزمان برخاست دهد و مدیریت کند. نوعهای توکار ExceptionGroup و BaseExceptionGroup امکان گروهبندی استثناها و برخاست دادن آنها با هم را فراهم میکنند، و سینتکس جدید except*، except را برای تطبیق زیرگروههای گروههای استثنا تعمیم میدهد.
برای جزئیات بیشتر به PEP 654 مراجعه کنید.
(مشارکتشده توسط Irit Katriel در bpo-45292. PEP نوشتهشده توسط Irit Katriel، Yury Selivanov و Guido van Rossum.)
PEP 678: میتوان استثناها را با یادداشتها غنی کرد¶
متد add_note() به BaseException اضافه شده است. از این متد میتوان برای غنیسازی استثناها با اطلاعات زمینهای که در زمان پرتاب استثنا در دسترس نیست، استفاده کرد. یادداشتهای اضافهشده در ردگیری پشتهی پیشفرض ظاهر میشوند.
برای جزئیات بیشتر به PEP 678 مراجعه کنید.
(مشارکتشده توسط Irit Katriel در bpo-45607. PEP نوشتهشده توسط Zac Hatfield-Dodds.)
بهبودهای راهانداز py.exe ویندوز¶
نسخهی مدیر نصب پایتون که به همراه پایتون 3.11 ارائه میشود، بهطور قابل توجهی بهروزرسانی شده است. این راهانداز اکنون با استفاده از آرگومان -V:<company>/<tag> بهجای آرگومان محدود -<major>.<minor>، از سینتکس شرکت/برچسب تعریفشده در PEP 514 پشتیبانی میکند. این امکان را فراهم میکند که توزیعهایی غیر از PythonCore — یعنی همان توزیعی که در python.org میزبانی میشود — راهاندازی شوند.
هنگام استفاده از گزینشگرهای -V:، میتوان شرکت یا برچسب را حذف کرد، اما همهی نصبها جستجو خواهند شد. برای مثال، -V:OtherPython/ «بهترین» برچسب ثبتشده برای OtherPython را انتخاب میکند، در حالی که -V:3.11 یا -V:/3.11 «بهترین» توزیع دارای برچسب 3.11 را انتخاب میکند.
هنگام استفاده از آرگومانهای قدیمی -<major>، -<major>.<minor>، -<major>-<bitness> یا -<major>.<minor>-<bitness>، تمام رفتار موجود از نسخههای گذشته باید حفظ شود و تنها نسخههای PythonCore انتخاب خواهند شد. با این حال، پسوند -64 اکنون به معنای «۳۲بیتی نیست» است (نه لزوماً x86-64)، زیرا پلتفرمهای ۶۴بیتی متعددی پشتیبانی میشوند. رانتایمهای ۳۲بیتی با بررسی برچسب رانتایم از نظر وجود پسوند -32 تشخیص داده میشوند. همهی نسخههای پایتون از 3.5 به بعد این مورد را در ساختهای ۳۲بیتی خود گنجاندهاند.
سایر تغییرات زبان¶
عبارتهای واگشایی ستارهدار اکنون میتوانند در دستورهای
forاستفاده شوند. (برای جزئیات بیشتر به bpo-46725 مراجعه کنید.)درکها ناهمگام اکنون درون درکها در توابع ناهمگام مجاز هستند. در این حالت، درکهای بیرونی بهطور ضمنی ناهمگام میشوند. (مشارکت Serhiy Storchaka در bpo-33346.)
در دستورهای
withوcontextlib.ExitStack.enter_context()برای اشیایی که پروتکل مدیر زمینه را پشتیبانی نمیکنند، و در دستورهایasync withوcontextlib.AsyncExitStack.enter_async_context()برای اشیایی که پروتکل مدیر زمینه ناهمگام را پشتیبانی نمیکنند، اکنون به جایAttributeErrorاستثنایTypeErrorپرتاب میشود. (مشارکتکننده: Serhiy Storchaka در bpo-12022 و bpo-44471.)متد
object.__getstate__()افزوده شد که پیادهسازی پیشفرض متد__getstate__()را فراهم میکند.copyکردن وpickleکردن نمونههای زیرکلاسهای انواع توکارbytearray،set،frozenset،collections.OrderedDict،collections.deque،weakref.WeakSetوdatetime.tzinfoاکنون ویژگیهای نمونه را که بهصورت جایگاهها پیادهسازیشدهاند، کپی و پیکل میکند. این تغییر یک عارضهی جانبی ناخواسته دارد: برای اقلیت کوچکی از پروژههای موجود پایتون که انتظار وجودobject.__getstate__()را ندارند، مشکل ایجاد میکند. برای دیدن بحثها دربارهی راهحلهای جایگزینی که چنین کدی ممکن است به آنها نیاز داشته باشد، به کامنتهای بعدی در gh-70766 مراجعه کنید. (مشارکتشده توسط Serhiy Storchaka در bpo-26579.)
گزینهی خط فرمان
-Pو متغیر محیطیPYTHONSAFEPATHافزوده شدند که پیشافزودن خودکار پوشهی اسکریپت بهsys.pathهنگام اجرای یک اسکریپت، یا پوشهی فعلی هنگام استفاده از-cو-mرا غیرفعال میکنند. این کار تضمین میکند کهimportفقط ماژولهای کتابخانه استاندارد و ماژولهای نصبشده را پیدا میکند، و از پوشاندن ناخواسته یا بدخواهانهی ماژولها توسط ماژولهای موجود در یک پوشهی محلی (که معمولاً قابل نوشتن توسط کاربر است) جلوگیری میکند. (مشارکتشده توسط Victor Stinner در gh-57684.)گزینهی
"z"به زبان کوچک مشخصات قالببندی اضافه شد که پس از گرد کردن به دقت قالب، صفر منفی را به صفر مثبت تبدیل میکند. برای جزئیات بیشتر به PEP 682 مراجعه کنید. (مشارکتشده توسط John Belmonte در gh-90153.)بایتها دیگر روی
sys.pathپذیرفته نمیشوند. پشتیبانی در جایی بین پایتون 3.2 و 3.6 از کار افتاد و کسی تا پس از انتشار پایتون 3.10.0 متوجه آن نشد. علاوه بر این، بازگرداندن پشتیبانی به دلیل برهمکنشهای میان-bوsys.path_importer_cacheهنگامی که ترکیبی از کلیدهایstrوbytesوجود دارد، مشکلساز خواهد بود. (مشارکت از Thomas Grainger در gh-91181.)
سایر تغییرات پیادهسازی سیپایتون¶
متدهای ویژهی
__complex__()برایcomplexو__bytes__()برایbytesبهمنظور پشتیبانی از پروتکلهایtyping.SupportsComplexوtyping.SupportsBytesپیادهسازی شدهاند. (با مشارکت Mark Dickinson و Donghee Na در bpo-24234.)siphash13بهعنوان یک الگوریتم هشسازی داخلی جدید افزوده شده است. این الگوریتم ویژگیهای امنیتی مشابهی باsiphash24دارد، اما برای ورودیهای طولانی کمی سریعتر است.str،bytesو برخی نوعهای دیگر اکنون از آن بهعنوان الگوریتم پیشفرض برایhash()استفاده میکنند. PEP 552 پروندههای pyc مبتنی بر هش نیز اکنون ازsiphash13استفاده میکنند. (مشارکتشده توسط اینادا نائوکی در bpo-29410.)وقتی یک استثنای فعال توسط دستور
raiseبدون پارامتر دوباره raise میشود، ردگیری پشتهی متصل به این استثنا اکنون همیشهsys.exc_info()[1].__traceback__است. این بدان معناست که تغییراتی که در بندexceptفعلی بر ردگیری پشته اعمال میشوند، در استثنای دوباره raiseشده منعکس میشوند. (مشارکتشده توسط ایریت کاتریل در bpo-45711.)بازنمایی وضعیت مفسر از استثناهای مدیریتشده (که با نام
exc_infoیا_PyErr_StackItemنیز شناخته میشود) اکنون تنها دارای فیلدexc_valueاست؛exc_typeوexc_tracebackحذف شدهاند، زیرا میتوان آنها را ازexc_valueبه دست آورد. (مشارکتشده توسط Irit Katriel در bpo-45711.)گزینه خط فرمان جدیدی با نام
AppendPathبرای نصاب ویندوز افزوده شده است. این گزینه رفتاری مشابهPrependPathدارد، اما پوشههای نصب و اسکریپتها را به انتها اضافه میکند، نه به ابتدا. (مشارکتشده توسط Bastian Neuburger در bpo-44934.)فیلد
PyConfig.module_search_paths_setاکنون باید روی1تنظیم شود تا مقداردهی اولیه ازPyConfig.module_search_pathsبرای مقداردهی اولیهیsys.pathاستفاده کند. در غیر این صورت، مقداردهی اولیه مسیر را دوباره محاسبه کرده و مقادیری را که بهmodule_search_pathsافزوده شدهاند جایگزین خواهد کرد.خروجی گزینهی
--helpاکنون در ۵۰ سطر/۸۰ ستون جا میشود. اطلاعات مربوط به متغیرهای محیطی پایتون و گزینههای-Xاکنون بهترتیب با استفاده از پرچمهای--help-envو--help-xoptions، و همچنین با گزینهی جدید--help-allدر دسترس است. (مشارکتشده توسط Éric Araujo در bpo-46142.)تبدیل بین
intوstrدر مبناهایی غیر از ۲ (دودویی)، ۴، ۸ (مبنای هشت)، ۱۶ (مبنای شانزده) یا ۳۲ — مانند مبنای ۱۰ (دهدهی) — در صورتی که تعداد ارقام به شکل رشته از حدی بیشتر باشد، اکنون استثنایValueErrorایجاد میکند تا از حملات احتمالی انکار سرویس ناشی از پیچیدگی الگوریتمی جلوگیری شود. این یک اقدام کاهشدهنده برای CVE 2020-10735 است. این حد را میتوان با متغیر محیطی، پرچم خط فرمان یا APIهایsysپیکربندی یا غیرفعال کرد. مستندات محدودیت طول تبدیل رشتهای عدد صحیح را ببینید. حد پیشفرض ۴۳۰۰ رقم به شکل رشته است.
ماژولهای جدید¶
ماژولهای بهبودیافته¶
asyncio¶
کلاس
TaskGroupافزوده شد؛ یک مدیر زمینه ناهمگام که گروهی از وظایف را نگه میدارد و هنگام خروج برای همه آنها منتظر میماند. برای کدهای جدید، استفاده از این کلاس بهجای بهکارگیری مستقیمcreate_task()وgather()توصیه میشود. (با مشارکت یوری سلیوانوف و دیگران در gh-90908.)timeout()افزوده شد؛ یک مدیر زمینه ناهمگام برای تعیین مهلت زمانی روی عملیاتهای ناهمگام. برای کدهای جدید، استفاده از این تابع بهجای استفاده مستقیم ازwait_for()توصیه میشود. (مشارکتشده توسط Andrew Svetlov در gh-90927.)کلاس
Runnerاضافه شد که سازوکار استفادهشده توسطrun()را در دسترس قرار میدهد. (با مشارکت Andrew Svetlov در gh-91218.)کلاس
Barrierبه همراه استثنای مرتبطBrokenBarrierErrorبه پریمیتیوهای همگامسازی در کتابخانه asyncio اضافه شد. (مشارکتشده توسط Yves Duprat و Andrew Svetlov در gh-87518.)آرگومان کلیدواژهای all_errors به
asyncio.loop.create_connection()افزوده شد تا بتوان چندین خطای اتصال را بهصورت یکExceptionGroupپرتاب کرد.متد
asyncio.StreamWriter.start_tls()برای ارتقای اتصالات موجودِ مبتنی بر جریان به TLS افزوده شد. (مشارکتشده توسط Ian Good در bpo-34975.)توابع خام سوکت دیتاگرام به حلقه رویداد اضافه شدند:
sock_sendto()،sock_recvfrom()وsock_recvfrom_into(). این توابع درSelectorEventLoopوProactorEventLoopپیادهسازی شدهاند. (مشارکتشده توسط Alex Grönholm در bpo-46805.)متدهای
cancelling()وuncancel()بهTaskافزوده شدند. این متدها عمدتاً برای استفاده داخلی در نظر گرفته شدهاند، بهویژه توسطTaskGroup.
contextlib¶
dataclasses¶
datetime¶
افزودن
datetime.UTC، یک نام مستعارِ کمکی برایdatetime.timezone.utc. (مشارکتشده توسط Kabir Kwatra در gh-91973.)datetime.date.fromisoformat()،datetime.time.fromisoformat()وdatetime.datetime.fromisoformat()اکنون میتوانند برای تجزیهی بیشتر قالبهای ISO 8601 استفاده شوند (تنها بهجز قالبهایی که از ساعت و دقیقهی کسری پشتیبانی میکنند). (مشارکت Paul Ganssle در gh-80010.)
enum¶
نام
EnumMetaبهEnumTypeتغییر یافت (EnumMetaبه عنوان نام مستعار حفظ شد).کلاس
StrEnumافزوده شد که اعضای آن میتوانند بهعنوان رشته استفاده شوند (و باید رشته باشند).کلاس
ReprEnumافزوده شد که تنها__repr__()اعضا را تغییر میدهد، در حالی که مقادیر لفظی آنها (بهجای نامها) را برای__str__()و__format__()برمیگرداند (که توسطstr()،format()و افاسترینگ استفاده میشوند).متد
Enum.__format__()(پیشفرض برایformat()،str.format()و f-strings) تغییر کرد تا همیشه همان نتیجهیEnum.__str__()را تولید کند: برای enumهایی که ازReprEnumارثبری میکنند، مقدار عضو خواهد بود؛ برای همهی enumهای دیگر، نام enum و نام عضو خواهد بود (مثلاًColor.RED).پارامتر کلاس جدید boundary به enumهای
Flagو enumFlagBoundaryبه همراه گزینههای آن افزوده شد تا نحوهی برخورد با مقادیر پرچم خارج از محدوده را کنترل کند.دکوراتور enum
verify()و enumEnumCheckبه همراه گزینههای آن، برای بررسی کلاسهای enum در برابر چندین محدودیت خاص افزوده شدند.دکوراتورهای
member()وnonmember()اضافه شدند تا اطمینان حاصل شود که شیء دکوراتورشده به عضو enum تبدیل میشود/نمیشود.دکوراتور
@~enum.propertyاضافه شد که مانند@propertyعمل میکند، بهجز برای enumها. بهجایtypes.DynamicClassAttribute()از این استفاده کنید.دکوراتور enum
global_enum()اضافه شد که__repr__()و__str__()را طوری تنظیم میکند که مقادیر را بهعنوان اعضای ماژول خودشان بهجای کلاس enum نمایش دهد. برای مثال،'re.ASCII'برای عضوASCIIازre.RegexFlagبهجای'RegexFlag.ASCII'.کلاس
Flagبهبود یافت تا ازlen()، پیمایش وin/not inبر روی اعضای آن پشتیبانی کند. برای مثال، عبارت زیر اکنون کار میکند:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)EnumوFlagتغییر یافتند بهطوریکه اعضا اکنون پیش از فراخوانی__init_subclass__()تعریف میشوند؛dir()اکنون متدها و غیره از نوعهای دادهی میکساین را شامل میشود.کلاس
Flagتغییر کرد تا فقط مقادیر اصلی (توان دو) را کانونیکال در نظر بگیرد، در حالی که مقادیر مرکب (3،6،10و غیره) بهعنوان نامهای مستعار در نظر گرفته میشوند؛ پرچمهای معکوس به معادل مثبت خود تبدیل ضمنی میشوند.
fcntl¶
در FreeBSD، پرچمهای
F_DUP2FDوF_DUP2FD_CLOEXECپشتیبانی میشوند که به ترتیب، اولی معادل استفاده ازdup2است و دومی علاوه بر آن پرچمFD_CLOEXECرا نیز تنظیم میکند.
fractions¶
functools¶
@functools.singledispatchاکنون ازtypes.UnionTypeوtyping.Unionبهعنوان حاشیهنویسی برای آرگومان ارسال پشتیبانی میکند.:>>> from functools import singledispatch >>> @singledispatch ... def fun(arg, verbose=False): ... if verbose: ... print("Let me just say,", end=" ") ... print(arg) ... >>> @fun.register ... def _(arg: int | float, verbose=False): ... if verbose: ... print("Strength in numbers, eh?", end=" ") ... print(arg) ... >>> from typing import Union >>> @fun.register ... def _(arg: Union[list, set], verbose=False): ... if verbose: ... print("Enumerate this:") ... for i, elem in enumerate(arg): ... print(i, elem) ...
(مشارکتشده توسط یوری کاراباس در bpo-46014.)
gzip¶
تابع
gzip.compress()اکنون هنگامی که با آرگومان mtime=0 استفاده میشود، سریعتر است، زیرا فشردهسازی را بهطور کامل به یک عملیاتzlib.compress()واگذار میکند. این تغییر یک اثر جانبی دارد: پرونده gzip در سرآیند خود یک بایت «OS» دارد. این بایت بهطور سنتی همیشه توسط ماژولgzipروی مقدار ۲۵۵ که نشاندهندهی «نامعلوم» است تنظیم میشد. اکنون، هنگام استفاده ازcompress()با mtime=0، ممکن است این بایت توسط کتابخانهی C زیرین zlib که پایتون با آن پیوند یافته است، روی مقدار متفاوتی تنظیم شود. (برای جزئیات دربارهی این اثر جانبی، gh-112346 را ببینید.)
hashlib¶
hashlib.blake2b()وhashlib.blake2s()اکنون libb2 را به نسخهی داخلی (vendored) پایتون ترجیح میدهند. (مشارکتشده توسط Christian Heimes در bpo-47095.)ماژول داخلی
_sha3با الگوریتمهای SHA3 و SHAKE اکنون بهجای Keccak Code Package از tiny_sha3 استفاده میکند تا حجم کد و پرونده دودویی کاهش یابد. ماژولhashlibپیادهسازیهای بهینهشدهی SHA3 و SHAKE از OpenSSL را ترجیح میدهد. این تغییر فقط بر نصبهایی که از OpenSSL پشتیبانی نمیکنند تأثیر میگذارد. (مشارکتشده توسط Christian Heimes در bpo-47098.)افزودن
hashlib.file_digest()، تابعی کمکی برای هشسازی کارآمد پروندهها یا اشیاء شبهپرونده. (ارائهشده توسط Christian Heimes در gh-89313.)
IDLE و idlelib¶
inspect¶
افزودن
getmembers_static()برای بازگرداندن همه اعضا بدون راهاندازی جستجوی پویا از طریق پروتکل توصیفگر. (مشارکتشده توسط Weipeng Hong در bpo-30533.)افزودن
ismethodwrapper()برای بررسی اینکه آیا نوع یک شیءMethodWrapperTypeاست. (مشارکتشده توسط Hakan Çelik در bpo-29418.)توابع مرتبط با فریم در ماژول
inspectتغییر کردهاند تا نمونههای جدیدی از کلاسهایFrameInfoوTracebackرا بازگردانند (سازگار به عقب با رابطهای شبیه تاپل نامدار پیشین) که اطلاعات موقعیت توسعهیافتهی PEP 657 (شماره سطر پایان، ستون و ستون پایان) را در بر میگیرند. توابع تحت تأثیر عبارتاند از:(مشارکتشده توسط Pablo Galindo در gh-88116.)
locale¶
تابع
locale.getencoding()برای دریافت کدگذاری locale جاری اضافه شد. این تابع مشابهlocale.getpreferredencoding(False)است، اما حالت UTF-8 پایتون را نادیده میگیرد.
logging¶
تابع
getLevelNamesMapping()اضافه شد تا نگاشتی از نامهای سطوح گزارشگیری (مانند'CRITICAL') به مقادیر سطوح گزارشگیری متناظرشان (مانند50، بهطور پیشفرض) را برگرداند. (مشارکت Andrei Kulakovin در gh-88024.)متد
createSocket()بهSysLogHandlerاضافه شد تا باSocketHandler.createSocket()مطابقت داشته باشد. این متد بهطور خودکار در طول مقداردهی اولیهی هندلر و هنگام صدور یک رویداد، در صورت نبود سوکت فعال، فراخوانی میشود. (مشارکتشده توسط Kirill Pinchuk در gh-88457.)
math¶
افزودن
math.exp2(): بازگرداندن ۲ به توان x. (مشارکتشده توسط گیدئون میچل در bpo-45917.)افزودن
math.cbrt(): بازگرداندن ریشه سوم x. (مشارکتشده توسط آجیت راماشاندران در bpo-44357.)رفتار دو حالت گوشهای از
math.pow()برای سازگاری با مشخصات IEEE 754 تغییر کرد. عملیاتهایmath.pow(0.0, -math.inf)وmath.pow(-0.0, -math.inf)اکنونinfرا برمیگردانند. قبلاً این عملیاتها استثنایValueErrorرا ایجاد میکردند. (مشارکت Mark Dickinson در bpo-44339.)مقدار
math.nanاکنون همیشه در دسترس است. (مشارکتشده توسط ویکتور استینر در bpo-46917.)
operator¶
تابع جدید
operator.callافزوده شده است، بهطوریکهoperator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (با مشارکت Antony Lee در bpo-44019.)
os¶
در ویندوز،
os.urandom()اکنون به جایCryptGenRandom()که منسوخ شده است، ازBCryptGenRandom()استفاده میکند. (مشارکتشده توسط Donghee Na در bpo-44611.)
pathlib¶
re¶
گروهبندی اتمی (
(?>...)) و کمیتگذارهای مالکانه (*+،++،?+،{m,n}+) اکنون در عبارات باقاعده پشتیبانی میشوند. (مشارکتشده توسط Jeffrey C. Jacobs و Serhiy Storchaka در bpo-433030.)
shutil¶
افزودن پارامتر اختیاری dir_fd در
shutil.rmtree(). (مشارکتکرده: Serhiy Storchaka در bpo-46245.)
socket¶
پشتیبانی از سوکت CAN برای NetBSD افزوده شد. (با مشارکت Thomas Klausner در bpo-30512.)
create_connection()گزینهای دارد که در صورت شکست در اتصال، بهجای اینکه تنها آخرین خطا ایجاد شود، یکExceptionGroupشامل تمام خطاها ایجاد میکند. (مشارکتشده توسط ایریت کاتریل در bpo-29980.)
sqlite3¶
اکنون میتوانید مجوزدهنده (authorizer) را با ارسال
Noneبهset_authorizer()غیرفعال کنید. (مشارکتشده توسط Erlend E. Aasland در bpo-44491.)نام ترتیبگذاریِ
create_collation()اکنون میتواند شامل هر نویسهی یونیکدی باشد. نامهای ترتیبگذاری با نویسههای نامعتبر اکنون به جایsqlite3.ProgrammingErrorخطایUnicodeEncodeErrorایجاد میکنند. (مشارکتشده توسط Erlend E. Aasland در bpo-44688.)استثناهای
sqlite3اکنون کد خطای توسعهیافتهی SQLite را بهصورتsqlite_errorcodeو نام خطای SQLite را بهصورتsqlite_errornameدر بر میگیرند. (مشارکتشده توسط Aviv Palivoda، Daniel Shahaf و Erlend E. Aasland در bpo-16379 و bpo-24139.)افزودن
setlimit()وgetlimit()بهsqlite3.Connectionبرای تنظیم و دریافت محدودیتهای SQLite به ازای هر اتصال. (با مشارکت Erlend E. Aasland در bpo-45243.)sqlite3اکنونsqlite3.threadsafetyرا بر اساس حالت نخبندی پیشفرضی که کتابخانهی زیربنایی SQLite با آن کامپایل شده است، تنظیم میکند. (مشارکت اِرلِند اِی. آسلاند در bpo-45613.)کالبکهای C ماژول
sqlite3اکنون در صورت فعال بودن ردگیریهای کالبک، از استثناهای غیرقابلپرتاب (unraisable) استفاده میکنند. کاربران اکنون میتوانند یکهندلر قلاب غیرقابلپرتاب (unraisable)ثبت کنند تا تجربه اشکالزدایی خود را بهبود بخشند. (مشارکتشده توسط Erlend E. Aasland در bpo-45828.)واکشی در حین بازگردانی دیگر
InterfaceErrorبرنمیانگیزد. در عوض، مدیریت این موارد را به کتابخانه SQLite واگذار میکنیم. (مشارکت: Erlend E. Aasland در bpo-44092.)متدهای
serialize()وdeserialize()برای سریالسازی و سریالزدایی پایگاههای داده بهsqlite3.Connectionافزوده شدند. (ارائهشده توسط Erlend E. Aasland در bpo-41930.)افزودن
create_window_function()بهsqlite3.Connectionبرای ایجاد توابع پنجرهای تجمیعی. (مشارکتشده توسط ارلند ای. آسلند در bpo-34916.)افزودن
blobopen()بهsqlite3.Connection.sqlite3.Blobامکان انجام عملیات ورودی/خروجی افزایشی بر روی بلابها را فراهم میکند. (مشارکتشده توسط آویو پالیوودا و ارلند ای. آسلند در bpo-24905.)
string¶
افزودن
get_identifiers()وis_valid()بهstring.Template، که به ترتیب همهی جاینگهدارهای معتبر و اینکه آیا جاینگهدار نامعتبری وجود دارد یا خیر را برمیگردانند. (مشارکت Ben Kehoe در gh-90465.)
sys¶
sys.exc_info()اکنون فیلدهایtypeوtracebackرا ازvalue(نمونهی استثنا) استخراج میکند؛ بنابراین وقتی استثنا در حین مدیریت آن تغییر داده شود، این تغییرات در نتایج فراخوانیهای بعدیexc_info()منعکس میشوند. (مشارکتشده توسط Irit Katriel در bpo-45711.)افزودن
sys.exception()که نمونه استثنای فعال را برمیگرداند (معادلsys.exc_info()[1]). (مشارکت Irit Katriel در bpo-46328.)افزودن پرچم
sys.flags.safe_path. (مشارکتشده توسط Victor Stinner در gh-57684.)
sysconfig¶
سه طرحوارهی نصب جدید (posix_venv، nt_venv و venv) افزوده شدند و زمانی استفاده میشوند که پایتون محیطهای مجازی جدید ایجاد کند یا از یک محیط مجازی در حال اجرا باشد. دو طرحوارهی نخست (posix_venv و nt_venv) مختص سیستمعاملاند و به ترتیب برای غیر ویندوز و ویندوز هستند؛ venv در واقع بسته به سیستمعاملی که پایتون روی آن اجرا میشود، مستعار یکی از آنهاست. این موضوع برای توزیعکنندگان پاییندستی که
sysconfig.get_preferred_scheme()را تغییر میدهند مفید است. کد شخص ثالثی که محیطهای مجازی جدید ایجاد میکند، باید برای تعیین مسیرها از طرحوارهی نصب جدید venv استفاده کند، همانطور کهvenvانجام میدهد. (مشارکتشده توسط Miro Hrončok در bpo-45413.)
tempfile¶
اشیاء
SpooledTemporaryFileاکنون متدهایio.BufferedIOBaseیاio.TextIOBaseرا بهطور کامل پیادهسازی میکنند (بسته به حالت پرونده). این امر باعث میشود آنها بهدرستی با APIهایی که انتظار شیء شبهپرونده دارند، مانند ماژولهای فشردهسازی، کار کنند. (مشارکت از Carey Metcalfe در gh-70363.)
threading¶
در یونیکس، اگر تابع
sem_clockwait()در کتابخانه C موجود باشد (glibc 2.30 و نسخههای جدیدتر)، متدthreading.Lock.acquire()اکنون برای مهلت زمانی از ساعت یکنواخت (time.CLOCK_MONOTONIC) استفاده میکند، نه از ساعت سیستم (time.CLOCK_REALTIME)، تا از تغییرات ساعت سیستم تأثیر نپذیرد. (مشارکتشده توسط ویکتور استینر در bpo-41710.)
time¶
در یونیکس،
time.sleep()اکنون در صورت موجود بودن، از تابعclock_nanosleep()یاnanosleep()استفاده میکند که وضوح ۱ نانوثانیه (10-9 ثانیه) دارد، بهجای استفاده ازselect()که وضوح ۱ میکروثانیه (10-6 ثانیه) دارد. (با همکاری Benjamin Szőke و Victor Stinner در bpo-21302.)در ویندوز 8.1 و جدیدتر،
time.sleep()اکنون از یک تایمر انتظارپذیر (waitable timer) مبتنی بر تایمرهای با وضوح بالا استفاده میکند که وضوحی برابر با ۱۰۰ نانوثانیه (10-7 ثانیه) دارد. پیش از این، وضوح آن ۱ میلیثانیه (10-3 ثانیه) بود. (مشارکتشده توسط Benjamin Szőke، Donghee Na، Eryk Sun و Victor Stinner در bpo-21302 و bpo-45429.)
tkinter¶
متد
info_patchlevel()اضافه شد که نسخه دقیق کتابخانه Tcl را بهصورت یک تاپل نامدار مشابهsys.version_infoبرمیگرداند. (مشارکت Serhiy Storchaka در gh-91827.)
traceback¶
افزودن
traceback.StackSummary.format_frame_summary()تا کاربران بتوانند بازنویسی کنند که کدام فریمها در ردگیری ظاهر شوند و چگونه قالببندی شوند. (مشارکتشده توسط Ammar Askar در bpo-44569.)افزودن
traceback.TracebackException.print()که نمونهی قالببندیشدهیTracebackExceptionرا در یک پرونده چاپ میکند. (مشارکتشده توسط Irit Katriel در bpo-33809.)
typing¶
برای تغییرات عمده، به قابلیتهای جدید مرتبط با راهنماهای نوع مراجعه کنید.
افزودن
typing.assert_never()وtyping.Never.typing.assert_never()برای درخواست از بررسیگر نوع جهت تأیید اینکه یک سطر از کد دسترسناپذیر است، مفید است. در زمان اجرا، این تابع استثنایAssertionErrorرا برمیاندازد. (مشارکتشده توسط Jelle Zijlstra در gh-90633.)افزودن
typing.reveal_type(). این تابع برای پرسیدن از بررسیگر نوع دربارهی اینکه چه نوعی را برای یک عبارت معین استنتاج کرده است، مفید است. در زمان اجرا، نوع مقدار دریافتشده را چاپ میکند. (مشارکتشده توسط Jelle Zijlstra در gh-90572.)افزودن
typing.assert_type(). این تابع برای اینکه از بررسیگر نوع بخواهید تأیید کند که نوعی که برای یک عبارت معین استنباط کرده است، با نوع دادهشده مطابقت دارد، مفید است. در زمان اجرا، این تابع صرفاً مقدار دریافتشده را برمیگرداند. (مشارکتکرده توسط Jelle Zijlstra در gh-90638.)نوعهای
typing.TypedDictاکنون میتوانند عام باشند. (مشارکتشده توسط Samodya Abeysiriwardane در gh-89026.)نوعهای
NamedTupleاکنون میتوانند عام باشند. (مشارکتشده توسط Serhiy Storchaka در bpo-43923.)زیرکلاسسازی از
typing.Anyمجاز است. این برای پرهیز از خطاهای بررسیگر نوع مرتبط با کلاسهای بسیار پویا، مانند ماکها، مفید است. (مشارکتشده توسط Shantanu Jain در gh-91154.)دکوراتور
@typing.finalاکنون ویژگی__final__را روی شیء تزئینشده تنظیم میکند. (مشارکتشده توسط یله زیلسترا در gh-90500.)از تابع
typing.get_overloads()میتوان برای دروننگری سربارگذاریهای یک تابع استفاده کرد. ازtyping.clear_overloads()میتوان برای پاک کردن تمام سربارگذاریهای ثبتشدهی یک تابع استفاده کرد. (مشارکتشده توسط Jelle Zijlstra در gh-89263.)متد
__init__()در زیرکلاسهایProtocolاکنون حفظ میشود. (مشارکتشده توسط Adrian Garcia Badarasco در gh-88970.)نمایش نوعهای تاپل خالی (
Tuple[()]) سادهسازی شده است. این امر بر دروننگری تأثیر میگذارد؛ برای مثال،get_args(Tuple[()])اکنون به جای((),)به()ارزیابی میشود. (مشارکتشده توسط Serhiy Storchaka در gh-91137.)سستکردن الزامات رانتایم برای حاشیهنویسیهای نوع با حذف بررسی فراخوانیپذیری در تابع خصوصی
typing._type_check. (مشارکتشده توسط گرگوری بورگارد در gh-90802.)typing.get_type_hints()اکنون از ارزیابی رشتهها بهعنوان ارجاعهای پیشرو در مستعارهای عام PEP 585 پشتیبانی میکند. (مشارکتشده توسط Niklas Rosenstein در gh-85542.)typing.get_type_hints()دیگرOptionalرا به پارامترهایی که مقدار پیشفرض آنهاNoneاست اضافه نمیکند. (مشارکتشده توسط Nikita Sobolev در gh-90353.)typing.get_type_hints()اکنون از ارزیابی حاشیهنویسیهای رشتهایِ سادهیClassVarپشتیبانی میکند. (مشارکت از سوی Gregory Beauregard در gh-90711.)@typing.no_type_checkدیگر کلاسها و توابع خارجی را تغییر نمیدهد. همچنین اکنون بهدرستی classmethodها را بهعنوان مواردی که نباید از نظر نوع بررسی شوند علامتگذاری میکند. (با مشارکت Nikita Sobolev در gh-90729.)
unicodedata¶
پایگاه دادهی یونیکد به نسخهی 14.0.0 بهروزرسانی شده است. (مشارکتشده توسط Benjamin Peterson در bpo-45190).
unittest¶
متدهای
enterContext()وenterClassContext()از کلاسTestCase، متدenterAsyncContext()از کلاسIsolatedAsyncioTestCaseو تابعunittest.enterModuleContext()افزوده شدند. (نوشتهی Serhiy Storchaka در bpo-45046.)
venv¶
هنگامی که محیطهای مجازی جدید پایتون ایجاد میشوند، venv از طرحواره نصب sysconfig برای تعیین مسیرهای درون محیط استفاده میکند. وقتی پایتون در یک محیط مجازی اجرا میشود، همان طرحواره نصب پیشفرض است. این بدان معناست که توزیعکنندگان پاییندست میتوانند طرحواره نصب پیشفرض sysconfig را بدون تغییر رفتار محیطهای مجازی تغییر دهند. کدهای شخص ثالثی که محیطهای مجازی جدید ایجاد میکنند نیز باید همین کار را انجام دهند. (مشارکتشده توسط Miro Hrončok در bpo-45413.)
warnings¶
warnings.catch_warnings()اکنون آرگومانهایی برایwarnings.simplefilter()میپذیرد و راهی مختصرتر برای نادیده گرفتن هشدارها بهصورت محلی یا تبدیل آنها به خطا فراهم میکند. (ارائهشده توسط Zac Hatfield-Dodds در bpo-47074.)
zipfile¶
پشتیبانی از تعیین کدگذاری نام عضو برای خواندن فرادادهها در پوشه و سرآیندهای پروندهی یک
ZipFileاضافه شد. (مشارکتشده توسط Stephen J. Turnbull و Serhiy Storchaka در bpo-28080.)ZipFile.mkdir()برای ایجاد پوشههای جدید درون آرشیوهای ZIP اضافه شد. (با مشارکت Sam Ezeh در gh-49083.)stem،suffixوsuffixesبهzipfile.Pathافزوده شدند. (مشارکتشده توسط میگل بریتو در gh-88261.)
بهینهسازیها¶
این بخش بهینهسازیهای خاصی را پوشش میدهد که مستقل از پروژهی سیپایتون سریعتر (Faster CPython) هستند؛ آن پروژه در بخش اختصاصی خود پوشش داده شده است.
کامپایلر اکنون قالببندی % به سبک printf ساده را روی رشتههای لفظی که تنها شامل کدهای قالب
%s،%rو%aهستند بهینهسازی میکند و آن را به سرعتِ عبارت f-string متناظر میرساند. (مشارکتشده توسط Serhiy Storchaka در bpo-28307.)تقسیم صحیح (
//) برای بهینهسازی توسط کامپایلرها بهتر تنظیم شده است. اکنون در x86-64، هنگام تقسیم یکintبر مقداری کوچکتر از2**30، حدود ۲۰٪ سریعتر است. (مشارکتشده توسط Gregory P. Smith و Tim Peters در gh-90564.)sum()اکنون برای اعداد صحیح کوچکتر از2**30تقریباً ۳۰ درصد سریعتر است. (مشارکتشده توسط Stefan Behnel در gh-68264.)تغییر اندازه فهرستها برای حالت رایج سادهسازی شده است که
list.append()را حدود ۱۵ درصد و درک فهرستی ساده را تا ۲۰ تا ۳۰ درصد سریعتر میکند (مشارکتشده توسط دنیس سوینی در gh-91165.)دیکتشنریها زمانی که همه کلیدها اشیای یونیکد باشند، مقادیر هش را ذخیره نمیکنند و این امر اندازه
dictرا کاهش میدهد. برای مثال،sys.getsizeof(dict.fromkeys("abcdefg"))روی پلتفرمهای ۶۴ بیتی از ۳۵۲ بایت به ۲۷۲ بایت (۲۳٪ کوچکتر) کاهش مییابد. (مشارکتکرده توسط اینادا نائوکی در bpo-46845.)استفاده از
asyncio.DatagramProtocolهنگام انتقال پروندههای بزرگ از طریق UDP اکنون چند مرتبه بزرگی سریعتر است، با سرعتی بیش از ۱۰۰ برابر برای پروندهای با حجم ≈60 MiB. (مشارکت msoxzw در gh-91487.)توابع
comb()وperm()در ماژولmathاکنون برای آرگومانهای بزرگ حدود ۱۰ برابر سریعتر هستند (با افزایش سرعت بیشتر برای k بزرگتر). (مشارکت Serhiy Storchaka در bpo-37295.)توابع
mean()،variance()وstdev()در ماژولstatisticsاکنون پیمایشگرها را در یک گذر مصرف میکنند، به جای آنکه ابتدا آنها را بهlistتبدیل کنند. این کار دو برابر سریعتر است و میتواند حافظهی قابلتوجهی صرفهجویی کند. (مشارکتشده توسط Raymond Hettinger در gh-90415.)unicodedata.normalize()اکنون رشتههای اسکی خالص را در زمان ثابت نرمالسازی میکند. (ارائهشده توسط Donghee Na در bpo-44987.)
سیپایتون سریعتر (Faster CPython)¶
بر اساس اندازهگیری با بدنه بنچمارک pyperformance، سیپایتون 3.11 هنگامی که با GCC روی اوبونتو لینوکس کامپایل شده باشد، بهطور میانگین ۲۵ درصد سریعتر از سیپایتون 3.10 است. بسته به بار کاری شما، افزایش سرعت کلی میتواند ۱۰ تا ۶۰ درصد باشد.
این پروژه بر دو حوزهی اصلی در پایتون تمرکز دارد: راهاندازی سریعتر و رانتایم سریعتر. بهینهسازیهایی که توسط این پروژه پوشش داده نمیشوند، بهطور جداگانه در بهینهسازیها فهرست شدهاند.
راهاندازی سریعتر¶
ایمپورتهای فریزشده / اشیاء کد ایستا¶
پایتون بایتکد را در پوشهی __pycache__ نهانگاه میکند تا بارگذاری ماژولها سریعتر شود.
قبلاً در 3.10، اجرای ماژول پایتون به این شکل بود:
خواندن __pycache__ -> مارشالگشایی -> شیء کد تخصیصیافته در هیپ -> ارزیابی
در پایتون 3.11، ماژولهای هستهای که برای راهاندازی پایتون ضروری هستند، «فریزشده» شدهاند. این بدان معناست که اشیاء کد آنها (و بایتکدشان) بهصورت ایستا توسط مفسر تخصیص داده میشوند. این امر مراحل فرایند اجرای ماژول را به موارد زیر کاهش میدهد:
شیء کدِ تخصیصیافته بهطور ایستا -> ارزیابی
راهاندازی مفسر در پایتون 3.11 اکنون ۱۰ تا ۱۵ درصد سریعتر است. این موضوع تأثیر بزرگی بر برنامههایی دارد که زمان اجرای کوتاهی دارند و از پایتون استفاده میکنند.
(مشارکتشده توسط Eric Snow، Guido van Rossum و Kumar Aditya در بسیاری از مسائل .)
رانتایم سریعتر¶
فریمهای ارزانتر و تنبلِ پایتون¶
فریمهای پایتون، که اطلاعات اجرا را در خود نگه میدارند، هر زمان که پایتون یک تابع پایتون را فراخوانی کند ایجاد میشوند. موارد زیر بهینهسازیهای جدید فریم هستند:
فرایند ایجاد فریم سادهسازی شد.
با استفاده مجدد سخاوتمندانه از فضای فریم روی پشتهی C، از تخصیص حافظه پرهیز شد.
ساختار داخلی فریم سادهسازی شد تا فقط اطلاعات ضروری را در بر بگیرد. فریمها پیشتر اطلاعات اضافی برای اشکالزدایی و مدیریت حافظه را نگه میداشتند.
اکنون اشیای فریم به سبک قدیمی تنها زمانی ایجاد میشوند که اشکالزداها یا توابع دروننگری پایتون مانند sys._getframe() و inspect.currentframe() آنها را درخواست کنند. در بیشتر کدهای کاربر، اصلاً هیچ شیء فریمی ایجاد نمیشود. در نتیجه، تقریباً همهی فراخوانیهای توابع پایتون بهطور چشمگیری سریعتر شدهاند. ما در pyperformance افزایش سرعت ۳ تا ۷ درصدی را اندازهگیری کردیم.
(با مشارکت مارک شانون در bpo-44590.)
فراخوانیهای درونخطی توابع پایتون¶
هنگام فراخوانی یک تابع پایتون، پایتون یک تابع C ارزیاب را فراخوانی میکند تا کد آن تابع را تفسیر کند. این امر عملاً بازگشتی پایتون خالص را به آنچه برای پشته C ایمن است محدود میکند.
در نسخهی 3.11، وقتی سیپایتون تشخیص میدهد که کد پایتون در حال فراخوانی تابع پایتونی دیگری است، یک فریم جدید ایجاد میکند و به کد جدید درون فریم جدید «میپرد». این کار از فراخوانی تابع تفسیر C بهکلی اجتناب میکند.
بیشتر فراخوانیهای تابع پایتون اکنون هیچ فضایی از پشته C مصرف نمیکنند، که این امر آنها را سریعتر میکند. در توابع بازگشتی سادهای مانند فیبوناچی یا فاکتوریل، افزایش سرعتی ۱.۷ برابری را مشاهده کردیم. این همچنین به این معناست که توابع بازگشتی میتوانند تا عمق بسیار بیشتری به بازگشت ادامه دهند (اگر کاربر محدودیت بازگشت را با sys.setrecursionlimit() افزایش دهد). بهبود ۱ تا ۳ درصدی را در pyperformance اندازهگیری کردیم.
(با مشارکت پابلو گالیندو و مارک شانون در bpo-45256.)
PEP 659: مفسر تطبیقی تخصصیساز (Specializing Adaptive Interpreter)¶
PEP 659 یکی از بخشهای کلیدی پروژه Faster CPython است. ایده کلی این است که هرچند پایتون یک زبان پویاست، بیشترِ کدها نواحیای دارند که در آنها اشیاء و نوعها بهندرت تغییر میکنند. این مفهوم با نام پایداری نوع شناخته میشود.
در زمان اجرا، پایتون تلاش میکند تا الگوهای رایج و پایداری نوع را در کد در حال اجرا بیابد. سپس پایتون عملیات فعلی را با عملیاتی تخصصیتر جایگزین میکند. این عملیات تخصصی از مسیرهای سریعی استفاده میکند که تنها برای آن موارد کاربرد/نوعها در دسترس هستند و عموماً بهتر از همتاهای عام خود عمل میکنند. این امر مفهوم دیگری به نام نهانگاهسازی درونخطی (inline caching) را نیز به همراه میآورد که در آن پایتون نتایج عملیاتهای پرهزینه را مستقیماً در بایتکد نهانگاهسازی میکند.
ویژهساز (specializer) همچنین برخی جفتهای دستورالعمل رایج را در یک ابردستورالعمل (superinstruction) ادغام میکند و سربار حین اجرا را کاهش میدهد.
پایتون تنها زمانی تخصصیسازی (specialization) انجام میدهد که کدی را «داغ» (hot) ببیند (چندینبار اجرا شده باشد). این کار مانع میشود پایتون زمان خود را روی کدهایی که فقط یکبار اجرا میشوند تلف کند. پایتون همچنین میتواند وقتی کد بیش از حد پویاست یا وقتی نحوه استفاده تغییر میکند، تخصصیسازی را لغو کند (de-specialize). تلاش برای تخصصیسازی بهصورت دورهای انجام میشود و تلاشهای تخصصیسازی بیش از حد پرهزینه نیستند، که این امر به تخصصیسازی اجازه میدهد با شرایط جدید سازگار شود.
(این PEP توسط Mark Shannon نوشتهشده است، با ایدههایی الهامگرفته از Stefan Brunthaler. برای اطلاعات بیشتر به PEP 659 مراجعه کنید. پیادهسازی توسط Mark Shannon و Brandt Bucher انجامشده است، با کمکهای بیشتر از سوی Irit Katriel و Dennis Sweeney.)
عملیات |
فرم |
تخصصیسازی |
افزایش سرعت عملیات (حداکثر) |
مشارکتکننده(ها) |
|---|---|---|---|---|
عملیات دودویی |
|
جمع، ضرب و تفریق دودویی برای نوعهای رایج مانند |
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
زیرنویس |
|
زیرنویسی نوعهای ظرفی مانند زیرنویسی |
10-25% |
Irit Katriel, Mark Shannon |
ذخیره زیرنویس |
|
مشابه ویژهسازی (specialization) زیرنویسی در بالا. |
10-25% |
Dennis Sweeney |
فراخوانیها |
|
فراخوانی توابع و نوعهای توکار (C) رایج مانند |
20% |
Mark Shannon, Ken Jin |
بارگذاری متغیر سراسری |
|
اندیس شیء در فضای نام سراسری/توکار (globals/builtins) در نهانگاه ذخیره میشود. بارگذاری سراسریها و توکارها به هیچ جستجوی فضای نام نیاز ندارد. |
Mark Shannon |
|
بارگذاری ویژگی |
|
مشابه بارگذاری متغیرهای سراسری. اندیس ویژگی درون فضای نام کلاس/شیء در نهانگاه ذخیره میشود. در بیشتر موارد، بارگذاری ویژگی به هیچ جستجویی در فضای نام نیاز نخواهد داشت. |
Mark Shannon |
|
بارگذاری متدها برای فراخوانی |
|
نشانی واقعی متد در نهانگاه ذخیره میشود. بارگذاری متد اکنون هیچ جستجویی در فضای نام ندارد — حتی برای کلاسهایی با زنجیرههای وراثت طولانی. |
10-20% |
Ken Jin, Mark Shannon |
ذخیرهسازی ویژگی |
|
مشابه بهینهسازی بارگذاری ویژگی. |
۲٪ در pyperformance |
Mark Shannon |
واگشایی دنباله |
|
برای ظرفهای رایجی مانند |
8% |
Brandt Bucher |
متفرقه¶
اشیاء اکنون به دلیل اینکه فضاهای نامشان بهصورت تنبل ایجاد میشوند، به حافظهی کمتری نیاز دارند. دیکشنریهای فضای نام آنها نیز اکنون کلیدها را آزادانهتر به اشتراک میگذارند. (مشارکت مارک شانون در bpo-45340 و bpo-40116.)
استثناهای «بدون هزینه» (zero-cost) پیادهسازی شدهاند که هزینهی دستورهای
tryرا در زمانی که هیچ استثنایی رخ نمیدهد، از بین میبرند. (با مشارکت Mark Shannon در bpo-40222.)نمایش مختصرترِ استثناها در مفسر، زمان مورد نیاز برای گرفتن یک استثنا را حدود ۱۰ درصد کاهش داد. (مشارکتشده توسط Irit Katriel در bpo-45711.)
موتور تطبیق عبارت باقاعدهی ماژول
reتا حدی بازآرایی شده است و اکنون در پلتفرمهای پشتیبانیشده از پرشهای محاسبهشده (computed gotos) (یا «کد زنجیرهای» (threaded code)) استفاده میکند. در نتیجه، پایتون 3.11 بنچمارکهای عبارت باقاعدهی pyperformance را تا ۱۰٪ سریعتر از پایتون 3.10 اجرا میکند. (مشارکتشده توسط Brandt Bucher در gh-91404.)
پرسشهای متداول¶
چگونه باید کد خودم را بنویسم تا از این افزایشهای سرعت بهره ببرم؟¶
کد پایتونیک بنویسید که از بهترین شیوههای رایج پیروی کند؛ لازم نیست کد خود را تغییر دهید. پروژه Faster CPython برای الگوهای رایج کدی که ما مشاهده میکنیم بهینهسازی میکند.
آیا سیپایتون 3.11 از حافظهی بیشتری استفاده میکند؟¶
شاید نه؛ انتظار نداریم مصرف حافظه نسبت به 3.10 بیش از ۲۰٪ بیشتر باشد. این موضوع با بهینهسازیهای حافظه برای اشیاء فریم و دیکشنریهای شیء که در بالا ذکر شد، جبران میشود.
هیچ افزایش سرعتی در بار کاری خود نمیبینم. چرا؟¶
برخی کدها سودمندی محسوسی نخواهند داشت. اگر کد شما بیشتر زمان خود را صرف عملیات ورودی/خروجی (I/O) میکند، یا از قبل بیشتر محاسبات خود را در یک کتابخانه توسعهای C مانند NumPy انجام میدهد، افزایش سرعت چشمگیری حاصل نخواهد شد. این پروژه در حال حاضر بیشترین سود را به بارهای کاری پایتون خالص میرساند.
علاوه بر این، ارقام pyperformance یک میانگین هندسی هستند. حتی در میان بنچمارکهای pyperformance، برخی بنچمارکها اندکی کند شدهاند، در حالی که برخی دیگر تقریباً ۲ برابر سریعتر شدهاند!
آیا کامپایلر در لحظه (JIT) وجود دارد؟¶
خیر. ما همچنان در حال بررسی بهینهسازیهای دیگر هستیم.
درباره¶
Faster CPython به بررسی بهینهسازیهایی برای CPython میپردازد. تیم اصلی توسط مایکروسافت تأمین مالی میشود تا بهصورت تماموقت روی این کار کند. پابلو گالیندو سالگادو نیز توسط Bloomberg LP تأمین مالی میشود تا بهصورت پارهوقت روی این پروژه کار کند. در نهایت، بسیاری از مشارکتکنندگان داوطلبانی از کامیونیتی هستند.
تغییرات بایتکد سیپایتون¶
بایتکد اکنون شامل ورودیهای نهانگاه درونخطی (inline cache) است که به شکل دستورالعملهای CACHE که بهتازگی افزوده شدهاند ظاهر میشوند. بسیاری از آپکدها انتظار دارند که تعداد دقیقی نهانگاه پس از آنها قرار گیرد و به مفسر دستور میدهند که در زمان اجرا از روی این نهانگاهها عبور کند. نهانگاههای پرشده میتوانند شبیه دستورالعملهای دلخواه به نظر برسند؛ بنابراین هنگام خواندن یا تغییر بایتکد خام و تطبیقی حاوی دادههای تسریعشده (quickened)، باید نهایت دقت را به کار برد.
آپکدهای جدید¶
ASYNC_GEN_WRAP،RETURN_GENERATORوSEND، که در تولیدگرها و همروالها استفاده میشوند.COPY_FREE_VARS، که از نیاز به کد خاص سمت فراخواننده برای بستارها جلوگیری میکند.JUMP_BACKWARD_NO_INTERRUPT، برای استفاده در حلقههای خاصی که مدیریت وقفهها در آنها نامطلوب است.MAKE_CELL، برای ایجاد شیءهای سلول.CHECK_EG_MATCHوPREP_RERAISE_STAR، برای مدیریت گروههای استثنا و except* جدید افزودهشده در PEP 654.PUSH_EXC_INFO، برای استفاده در هندلرهای استثنا.RESUME، یک عملیات بیاثر، برای ردگیری داخلی، اشکالزدایی و بررسیهای بهینهسازی.
آپکدهای جایگزینشده¶
آپکد(های) جایگزینشده |
آپکد(های) جدید |
نکتهها |
|---|---|---|
BINARY_*INPLACE_* |
همهی کدهایعمل دودویی/درجای عددی با یک آپکد واحد جایگزین شدند |
|
CALL_FUNCTIONCALL_FUNCTION_KWCALL_METHOD |
جابهجایی آرگومانها برای متدها را از مدیریت آرگومانهای کلیدواژهای جدا میکند؛ امکان تخصصیسازی (specialization) بهتر فراخوانیها را فراهم میکند |
|
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N |
دستورهای دستکاری پشته |
|
JUMP_IF_NOT_EXC_MATCH |
اکنون بررسی انجام میدهد اما پرش نمیکند |
|
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE |
ببینید [3]؛ گونههای |
|
SETUP_WITHSETUP_ASYNC_WITH |
|
راهاندازی بلوک |
همهی آپکدهای پرش اکنون نسبی هستند، از جمله آپکدهای موجود JUMP_IF_TRUE_OR_POP و JUMP_IF_FALSE_OR_POP. آرگومان اکنون بهجای یک مکان مطلق، آفستی نسبت به دستور فعلی است.
آپکدهای تغییریافته/حذفشده¶
MATCH_CLASSوMATCH_KEYSتغییر کردند تا دیگر مقدار بولی اضافی برای نشان دادن موفقیت/شکست روی پشته قرار ندهند. در عوض،Noneدر صورت شکست به جای تاپل مقادیر استخراجشده روی پشته قرار میگیرد.کدهای عملی که با استثناها کار میکنند تغییر کردند تا بازتاب دهند که استثناها اکنون بهجای سه آیتم، بهصورت یک آیتم روی پشته نمایش داده میشوند (نگاه کنید به gh-89874).
COPY_DICT_WITHOUT_KEYS،GEN_START،POP_BLOCK،SETUP_FINALLYوYIELD_FROMحذف شدند.
منسوخ¶
این بخش APIهای پایتون را که در پایتون 3.11 منسوخ شدهاند فهرست میکند.
APIهای منسوخ C بهصورت جداگانه فهرست شدهاند.
زبان/توکارها¶
زنجیرهسازی توصیفگرهای
classmethod(که در bpo-19072 معرفی شد) اکنون منسوخ شده است. دیگر نمیتوان از آن برای پوشش دادن توصیفگرهای دیگر مانندpropertyاستفاده کرد. طراحی اصلی این قابلیت معیوب بود و باعث بروز تعدادی مشکل پاییندستی شد. برای «عبور دادن» (pass-through) یکclassmethod، استفاده از ویژگی__wrapped__(که در پایتون 3.10 اضافه شد) را در نظر بگیرید. (مشارکتشده توسط ریموند هتینگر در gh-89519.)گریزهای مبنای هشت در مقادیر لفظی رشته و بایت که مقداری بزرگتر از
0o377(۲۵۵ در مبنای ده) دارند، اکنون یکDeprecationWarningتولید میکنند. در نسخهای آینده از پایتون، این گریزها یکSyntaxWarningو در نهایت یکSyntaxErrorایجاد خواهند کرد. (مشارکتشده توسط Serhiy Storchaka در gh-81548.)واگذاری
int()به__trunc__()اکنون منسوخ شده است. فراخوانیint(a)زمانی کهtype(a)__trunc__()را پیادهسازی میکند اما__int__()یا__index__()را پیادهسازی نمیکند، اکنون یکDeprecationWarningایجاد میکند. (مشارکتشده توسط Zackery Spytz در bpo-44977.)
ماژولها¶
PEP 594 منجر به منسوخ شدن ماژولهای زیر شد که قرار بود در Python 3.13 حذف شوند:
aifcchunkmsilibpipestelnetlibaudioopcryptnissndhdruucgiimghdrnntplibspwdxdrlibcgitbmailcapossaudiodevsunau(با مشارکت Brett Cannon در bpo-47061 و Victor Stinner در gh-68966.)
ماژولهای
asynchat،asyncoreوsmtpdدستکم از پایتون 3.6 منسوخ شدهاند. مستندات و هشدارهای منسوخشدگی آنها اکنون بهروزرسانی شدهاند تا ذکر کنند که در پایتون 3.12 حذف خواهند شد. (مشارکتشده توسط Hugo van Kemenade در bpo-47022.)بستهی
lib2to3و ابزار2to3اکنون منسوخ شدهاند و ممکن است نتوانند پایتون 3.10 یا جدیدتر را تجزیه کنند. برای جزئیات به PEP 617، که پارسر جدید PEG را معرفی میکند، مراجعه کنید. (با مشارکت Victor Stinner در bpo-40360.)ماژولهای مستندنشده
sre_compile،sre_constantsوsre_parseاکنون منسوخ شدهاند. (مشارکتشده توسط Serhiy Storchaka در bpo-47152.)
کتابخانه استاندارد¶
موارد زیر از زمان پایتون 3.2 در
configparserمنسوخ شدهاند. هشدارهای منسوخشدن آنها اکنون بهروزرسانی شدهاند تا یادآور شوند که در پایتون 3.12 حذف خواهند شد:کلاس
configparser.SafeConfigParserویژگی
configparser.ParsingError.filenameمتد
configparser.RawConfigParser.readfp()
(مشارکتشده توسط هوگو ون کمِناده در bpo-45173.)
configparser.LegacyInterpolationاز پایتون 3.2 در رشته مستند خود منسوخ اعلام شده و در مستنداتconfigparserفهرست نشده است. این کلاس اکنونDeprecationWarningرا نشان میدهد و در پایتون 3.13 حذف خواهد شد. به جای آن ازconfigparser.BasicInterpolationیاconfigparser.ExtendedInterpolationاستفاده کنید. (مشارکتشده توسط هوگو ون کمِناده در bpo-46607.)مجموعه قدیمیتر توابع
importlib.resourcesبه نفع جایگزینهای افزودهشده در Python 3.9 منسوخ شدهاند و به دلیل پشتیبانی نکردن از منابع واقع در زیرپوشههای بسته، در نسخهای آینده از پایتون حذف خواهند شد:importlib.resources.contents()importlib.resources.is_resource()importlib.resources.open_binary()importlib.resources.open_text()importlib.resources.read_binary()importlib.resources.read_text()importlib.resources.path()
تابع
locale.getdefaultlocale()منسوخ شده است و در پایتون 3.15 حذف خواهد شد. به جای آن از توابعlocale.setlocale()،locale.getpreferredencoding(False)وlocale.getlocale()استفاده کنید. (مشارکتشده توسط Victor Stinner در gh-90817.)تابع
locale.resetlocale()منسوخ شده است و در پایتون 3.13 حذف خواهد شد. بهجای آن ازlocale.setlocale(locale.LC_ALL, "")استفاده کنید. (مشارکتشده توسط Victor Stinner در gh-90817.)اکنون قواعد سختگیرانهتری برای ارجاعهای عددی به گروهها و نامهای گروه در عبارات باقاعده اعمال میشود. از این پس فقط دنبالههایی از ارقام اسکی بهعنوان ارجاع عددی پذیرفته میشوند و نام گروه در الگوهای
bytesو رشتههای جایگزینی تنها میتواند شامل حروف اسکی، ارقام و زیرخط باشد. در حال حاضر، برای سینتکسی که این قواعد را نقض میکند، هشدار منسوخشدن نشان داده میشود. (مشارکتشده توسط Serhiy Storchaka در gh-91760.)در ماژول
re، تابعre.template()و پرچمهای متناظرre.TEMPLATEوre.Tمنسوخ شدهاند، زیرا مستند نشده بودند و هدف روشنی نداشتند. این موارد در پایتون 3.13 حذف خواهند شد. (مشارکتشده توسط Serhiy Storchaka و Miro Hrončok در gh-92728.)turtle.settiltangle()از پایتون 3.1 منسوخ شده است؛ این تابع اکنون هشدار منسوخشدن منتشر میکند و در پایتون 3.13 حذف خواهد شد. به جای آن ازturtle.tiltangle()استفاده کنید (این تابع پیشتر به اشتباه به عنوان منسوخ علامتگذاری شده بود و رشته مستند آن اکنون اصلاح شده است). (مشارکتشده توسط Hugo van Kemenade در bpo-45837.)typing.Textکه صرفاً برای فراهمکردن پشتیبانی از سازگاری بین کد پایتون 2 و پایتون 3 وجود دارد، اکنون منسوخ شده است. در حال حاضر برنامهای برای حذف آن وجود ندارد، اما به کاربران توصیه میشود در هر جا که ممکن است، به جای آن ازstrاستفاده کنند. (مشارکتشده توسط Alex Waygood در gh-92332.)سینتکس آرگومان کلیدواژهای برای ساخت نوعهای
typing.TypedDictاکنون منسوخ شده است. پشتیبانی از آن در پایتون 3.13 حذف خواهد شد. (مشارکتشده توسط Jingchen Ye در gh-90224.)webbrowser.MacOSXمنسوخ شده است و در پایتون 3.13 حذف خواهد شد. این کلاس آزموننشده و مستندسازینشده است و خودِwebbrowserاز آن استفاده نمیکند. (مشارکتشده توسط Donghee Na در bpo-42255.)رفتار برگرداندن مقدار از متدهای آزمون
TestCaseوIsolatedAsyncioTestCase(بهجز مقدار پیشفرضNone) اکنون منسوخ شده است.توابع زیر از
unittestکه بهطور رسمی مستند نشدهاند، منسوخ شدند و برای حذف در پایتون 3.13 برنامهریزی شدهاند:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
بهجای آن از متدهای
TestLoaderاستفاده کنید:(ارائهشده توسط Erlend E. Aasland در bpo-5846.)
unittest.TestProgram.usageExit()بهعنوان منسوخ علامتگذاری شده است و در 3.13 حذف خواهد شد. (مشارکتشده توسط Carlos Damázio در gh-67048.)
در انتظار حذف در پایتون 3.12¶
APIهای پایتون زیر در نسخههای پیشین منسوخ شدهاند و در پایتون 3.12 حذف خواهند شد.
APIهای C که در انتظار حذف هستند، بهصورت جداگانه فهرست شدهاند.
ماژول
asynchatماژول
asyncoreماژول
impفضای نام
typing.ioفضای نام
typing.recgi.log()importlib.find_loader()importlib.abc.Loader.module_repr()importlib.abc.MetaPathFinder.find_module()importlib.abc.PathEntryFinder.find_loader()importlib.abc.PathEntryFinder.find_module()importlib.machinery.BuiltinImporter.find_module()importlib.machinery.BuiltinLoader.module_repr()importlib.machinery.FileFinder.find_loader()importlib.machinery.FileFinder.find_module()importlib.machinery.FrozenImporter.find_module()importlib.machinery.FrozenLoader.module_repr()importlib.machinery.PathFinder.find_module()importlib.machinery.WindowsRegistryFinder.find_module()importlib.util.module_for_loader()importlib.util.set_loader_wrapper()importlib.util.set_package_wrapper()pkgutil.ImpImporterpkgutil.ImpLoaderpathlib.Path.link_to()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()متغیر محیطی
PYTHONTHREADDEBUGنامهای مستعار منسوخِ زیر در
unittest:نام مستعار منسوخ
نام متد
منسوخ در
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
حذفشده¶
این بخش APIهای پایتون را که در پایتون 3.11 حذف شدهاند، فهرست میکند.
APIهای C حذفشده بهصورت جداگانه فهرست شدهاند.
decorator
@asyncio.coroutine()که به همروالهای قدیمی مبتنی بر تولیدگر امکان میداد با کدasync/awaitسازگار باشند، حذف شد. این تابع از پایتون 3.8 منسوخ شده بود و حذف آن در ابتدا برای پایتون 3.10 برنامهریزی شده بود. بهجای آن ازasync defاستفاده کنید. (مشارکتشده توسط Illia Volochii در bpo-43216.)کلاس
asyncio.coroutines.CoroWrapperکه در حالت اشکالزدایی برای پوشش دادن اشیای همروال قدیمی مبتنی بر تولیدگر استفاده میشد، حذف شد. (نوشتهشده توسط ایلیا ولوچی در bpo-43216.)به دلیل نگرانیهای امنیتی جدی، پارامتر reuse_address از
asyncio.loop.create_datagram_endpoint()که در پایتون 3.9 غیرفعال شده بود، اکنون بهطور کامل حذف شده است. دلیل این امر، رفتار گزینهی سوکتSO_REUSEADDRدر UDP است. (با مشارکت هوگو ون کمِناده در bpo-45129.)ماژول
binhexکه در Python 3.9 منسوخ شده بود، حذف شد. همچنین توابع مرتبط درbinasciiکه بهطور مشابه منسوخ شده بودند، حذف شدند:binascii.a2b_hqx()binascii.b2a_hqx()binascii.rlecode_hqx()binascii.rldecode_hqx()
تابع
binascii.crc_hqx()همچنان در دسترس است.(مشارکتشده توسط ویکتور استینر در bpo-45085.)
دستور
bdist_msiدرdistutilsکه در پایتون 3.9 منسوخ شده بود، حذف شد. بهجای آن ازbdist_wheel(بستههای wheel) استفاده کنید. (مشارکتشده توسط Hugo van Kemenade در bpo-45124.)متدهای
__getitem__()ازxml.dom.pulldom.DOMEventStream،wsgiref.util.FileWrapperوfileinput.FileInputکه از پایتون 3.9 منسوخ شده بودند، حذف شدند. (مشارکتشده توسط Hugo van Kemenade در bpo-45132.)توابع منسوخ
gettextشاملlgettext()،ldgettext()،lngettext()وldngettext()حذف شدند. همچنین تابعbind_textdomain_codeset()، متدهایNullTranslations.output_charset()وNullTranslations.set_output_charset()و پارامتر codeset ازtranslation()وinstall()حذف شدند، زیرا آنها فقط برای توابعl*gettext()استفاده میشوند. (مشارکتشده توسط Donghee Na و Serhiy Storchaka در bpo-44235.)حذفشده از ماژول
inspect:تابع
getargspec()که از پایتون 3.0 منسوخ شده است؛ بهجای آن ازinspect.signature()یاinspect.getfullargspec()استفاده کنید.تابع
formatargspec()که از پایتون 3.5 منسوخ شده است؛ مستقیماً از تابعinspect.signature()یا شیءinspect.Signatureاستفاده کنید.متدهای مستندسازینشدهی
Signature.from_builtin()وSignature.from_function()که از پایتون 3.5 منسوخ شدهاند؛ بهجای آنها از متدSignature.from_callable()استفاده کنید.
(با مشارکت Hugo van Kemenade در bpo-45320.)
متد
__class_getitem__()ازpathlib.PurePathحذف شد، زیرا استفاده نمیشد و در نسخههای قبلی به اشتباه اضافه شده بود. (ارائهشده توسط Nikita Sobolev در bpo-46483.)کلاس
MailmanProxyدر ماژولsmtpdحذف شد، زیرا بدون بستهی خارجیmailmanقابل استفاده نیست. (مشارکتکننده: Donghee Na در bpo-35800.)متد منسوخ
split()از_tkinter.TkappTypeحذف شد. (مشارکتشده توسط Erlend E. Aasland در bpo-38371.)پشتیبانی از بسته فضای نام از کشف آزمون
unittestحذف شد. این قابلیت در پایتون 3.4 معرفی شد، اما از پایتون 3.7 به بعد خراب بوده است. (با مشارکت Inada Naoki در bpo-23882.)متد خصوصی بدون مستندات
float.__set_format__()که پیشتر در Python 3.7 با نامfloat.__setformat__()شناخته میشد، حذف شد. رشته مستند آن میگفت: «به احتمال زیاد نمیخواهید از این تابع استفاده کنید. این تابع عمدتاً برای استفاده در بدنه آزمونهای پایتون وجود دارد.» (مشارکتشده توسط ویکتور استینر در bpo-46852.)پرچم پیکربندی
--experimental-isolated-subinterpreters(و ماکروی متناظرEXPERIMENTAL_ISOLATED_SUBINTERPRETERS) حذف شدهاند.Pynche --- ویرایشگر رنگ و فام طبیعی به سبک پایتون --- از
Tools/scriptsخارج شده و بهطور مستقل از درخت منبع پایتون در حال توسعه است.
مهاجرت به پایتون 3.11¶
این بخش، تغییرات پیشتر توضیح دادهشده و سایر رفع اشکالها در API پایتون را فهرست میکند که ممکن است نیازمند تغییراتی در کد پایتون شما باشند.
نکات انتقال برای API زبان C بهصورت جداگانه فهرست شدهاند.
open()،io.open()،codecs.open()وfileinput.FileInputدیگر'U'(«سطرهای جدید همگانی») را در حالت پرونده نمیپذیرند. در پایتون 3، هر زمان که پروندهای در حالت متنی باز شود، بهصورت پیشفرض از حالت «سطرهای جدید همگانی» استفاده میشود و پرچم'U'از پایتون 3.3 منسوخ شده است. پارامتر newline این توابع کنترل میکند که سطرهای جدید همگانی چگونه کار میکنند. (مشارکتشده توسط Victor Stinner در bpo-37330.)موقعیتهای گره
ast.ASTاکنون هنگام ارائه بهcompile()و سایر توابع مرتبط اعتبارسنجی میشوند. در صورت تشخیص موقعیتهای نامعتبر، یکValueErrorپرتاب خواهد شد. (مشارکتشده توسط Pablo Galindo در gh-93351)گذراندن اجراکنندههای غیر
concurrent.futures.ThreadPoolExecutorبهasyncio.loop.set_default_executor()در پی منسوخشدگی در پایتون 3.8 ممنوع شد. (با مشارکت Illia Volochii در bpo-43234.)calendar: کلاسهایcalendar.LocaleTextCalendarوcalendar.LocaleHTMLCalendarاکنون اگر localeای تعیین نشده باشد، به جای استفاده ازlocale.getdefaultlocale()، ازlocale.getlocale()استفاده میکنند. (مشارکتشده توسط Victor Stinner در bpo-46659.)ماژول
pdbاکنون پرونده پیکربندی.pdbrcرا با کدگذاری'UTF-8'میخواند. (مشارکتشده توسط Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) در bpo-41137.)پارامتر population در
random.sample()باید یک دنباله باشد و تبدیل خودکارsets بهlists دیگر پشتیبانی نمیشود. همچنین، اگر اندازهی نمونه بزرگتر از اندازهی جمعیت باشد، یکValueErrorنشان داده میشود. (مشارکت Raymond Hettinger در bpo-40465.)پارامتر اختیاری random از
random.shuffle()حذف شد. این پارامتر پیشتر تابع تصادفی دلخواهی بود که برای بر زدن استفاده میشد؛ اکنون همیشه ازrandom.random()(پیشفرض قبلی آن) استفاده خواهد شد.در سینتکس عبارت باقاعده ماژول
re، پرچمهای درونخطی سراسری (مانند(?i)) اکنون فقط میتوانند در ابتدای عبارات باقاعده استفاده شوند. استفاده از آنها در جایهای دیگر، از پایتون 3.6 منسوخ شده است. (مشارکتشده توسط Serhiy Storchaka در bpo-47066.)در ماژول
re، چندین اشکال قدیمی برطرف شدند که در موارد نادر میتوانستند باعث شوند گروههای ثبتکننده نتیجهی نادرست بگیرند. بنابراین، این میتواند خروجی ثبتشده را در این موارد تغییر دهد. (مشارکتشده توسط Ma Lin در bpo-35859.)
تغییرات ساخت¶
سیپایتون اکنون طبق PEP 11 دارای پشتیبانی سطح ۳ برای کامپایل متقاطع به پلتفرمهای WebAssembly یعنی Emscripten (
wasm32-unknown-emscripten، یعنی پایتون در مرورگر) و WebAssembly System Interface (WASI) (wasm32-unknown-wasi) است. این تلاش از کارهای پیشین مانند Pyodide الهامگرفته است. این پلتفرمها زیرمجموعهی محدودی از APIهای POSIX را فراهم میکنند؛ قابلیتها و ماژولهای کتابخانههای استاندارد پایتون که با شبکه، فرایندها، نخبندی، سیگنالها، mmap و کاربران/گروهها مرتبط هستند، در دسترس نیستند یا کار نمیکنند. (Emscripten با مشارکت Christian Heimes و Ethan Smith در gh-84461 و WASI با مشارکت Christian Heimes در gh-90473 ارائه شد؛ پلتفرمها در gh-95085 ارتقا یافتند)ساخت سیپایتون اکنون نیازمند موارد زیر است:
ماکروی
Py_NO_NANحذف شده است. از آنجا که سیپایتون اکنون به اعداد ممیز شناور IEEE 754 نیاز دارد، مقادیر NaN همیشه در دسترس هستند. (مشارکتشده توسط Victor Stinner در bpo-46656.)بستهی
tkinterاکنون به Tcl/Tk نسخهی 8.5.12 یا جدیدتر نیاز دارد. (مشارکتشده توسط Serhiy Storchaka در bpo-46996.)وابستگیهای ساخت، پرچمهای کامپایلر و پرچمهای پیونددهنده برای بیشتر ماژولهای توسعهای کتابخانه استاندارد اکنون توسط configure تشخیص داده میشوند. پرچمهای libffi، libnsl، libsqlite3، zlib، bzip2، liblzma، libcrypt، Tcl/Tk و uuid توسط pkg-config (در صورت موجود بودن) تشخیص داده میشوند.
tkinterاکنون برای تشخیص تنظیمات توسعه سرآیندها و کتابخانههای Tcl/Tk به یک فرمان pkg-config نیاز دارد. (مشارکتشده توسط Christian Heimes و Erlend Egeberg Aasland در bpo-45847، bpo-45747 و bpo-45763.)libpython دیگر به libcrypt پیوند نمیشود. (مشارکتشده توسط Mike Gilbert در bpo-45433.)
اکنون میتوان سیپایتون را با گزینهی ThinLTO از طریق ارسال
thinبه--with-ltoساخت، یعنی--with-lto=thin. (مشارکت دادهشده توسط Donghee Na و Brett Holman در bpo-44340.)اکنون میتوان فریلیستهای (freelist) مربوط به ساختارهای شیء را غیرفعال کرد. برای غیرفعال کردن همهی فریلیستها بهجز تکنمونهی تاپل خالی میتوان از گزینهی جدید
--without-freelistsدر configure استفاده کرد. (با مشارکت Christian Heimes در bpo-45522.)Modules/SetupوModules/makesetupبهبود یافته و تکمیل شدهاند. اکنون میتوان ماژولهای توسعهای را از طریقmakesetupساخت. همهی ماژولها بهجز برخی ماژولهای آزمون را میتوان بهصورت ایستا به یک دودویی یا کتابخانهی اصلی پیوند داد. (مشارکتشده توسط Brett Cannon و Christian Heimes در bpo-45548، bpo-45570، bpo-45571 و bpo-43974.)توجه
از متغیرهای محیطی
TCLTK_CFLAGSوTCLTK_LIBSاستفاده کنید تا مکان سرآیندها و کتابخانههای Tcl/Tk را بهصورت دستی مشخص کنید. گزینههای configure با نامهای--with-tcltk-includesو--with-tcltk-libsحذف شدهاند.در RHEL 7 و CentOS 7، بستههای توسعه
tcl.pcوtk.pcرا ارائه نمیدهند؛ ازTCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"استفاده کنید. پوشهیMisc/rhel7شامل پروندههای.pcو دستورالعملهایی دربارهی نحوهی ساخت پایتون با Tcl/Tk و OpenSSL مربوط به RHEL 7 و CentOS 7 است.سیپایتون اکنون بهصورت پیشفرض برای پیادهسازی
intپایتون از رقمهای ۳۰ بیتی استفاده میکند. پیشتر، حالت پیشفرض استفاده از رقمهای ۳۰ بیتی روی پلتفرمهایی باSIZEOF_VOID_P >= 8و رقمهای ۱۵ بیتی در غیر این صورت بود. همچنان میتوان استفاده از رقمهای ۱۵ بیتی را بهطور صریح از طریق گزینهی--enable-big-digitsبرای اسکریپت configure یا (برای ویندوز) متغیرPYLONG_BITS_IN_DIGITدرPC/pyconfig.hدرخواست کرد، اما این گزینه ممکن است در زمانی در آینده حذف شود. (مشارکت Mark Dickinson در bpo-45569.)
تغییرات C API¶
ویژگیهای جدید¶
تابع جدید
PyType_GetName()برای دریافت نام کوتاه نوع اضافه شد. (مشارکتشده توسط Hai Shi در bpo-42035.)تابع جدید
PyType_GetQualName()برای دریافت نام کامل نوع اضافه شد. (مشارکت Hai Shi در bpo-42035.)توابع جدید
PyThreadState_EnterTracing()وPyThreadState_LeaveTracing()برای تعلیق و از سر گرفتن ردیابی و پروفایلگیری به C API محدود اضافه شدند. (با مشارکت ویکتور استینر در bpo-43760.)ثابت
Py_Versionکه همان مقدارPY_VERSION_HEXرا دارد، اضافه شد. (مشارکتشده توسط Gabriele N. Tornetta در bpo-43931.)Py_bufferو APIها اکنون بخشی از API محدود و ABI پایدار هستند:جایگاههای نوع
bf_getbufferوbf_releasebuffer
(با مشارکت کریستین هایمز در bpo-45459.)
تابع
PyType_GetModuleByDef()افزوده شد که در مواردی که این اطلاعات بهطور مستقیم (از طریقPyCMethod) در دسترس نیست، برای بهدستآوردن ماژولی که متدی در آن تعریف شده است استفاده میشود. (مشارکت Petr Viktorin در bpo-46613.)توابع جدیدی برای بستهبندی و واگشایی ممیز شناور با دقت مضاعف زبان C (سریالسازی و سریالزدایی) اضافه شدند:
PyFloat_Pack2()،PyFloat_Pack4()،PyFloat_Pack8()،PyFloat_Unpack2()،PyFloat_Unpack4()وPyFloat_Unpack8(). (با مشارکت Victor Stinner در bpo-46906.)توابع جدیدی برای دریافت ویژگیهای شیء فریم افزوده شد:
PyFrame_GetBuiltins()،PyFrame_GetGenerator()،PyFrame_GetGlobals()،PyFrame_GetLasti().دو تابع جدید برای دریافت و تنظیم نمونهی استثنای فعال افزوده شد:
PyErr_GetHandledException()وPyErr_SetHandledException(). این توابع جایگزینهایی برایPyErr_SetExcInfo()وPyErr_GetExcInfo()هستند که با نمایش تاپل سهگانهی قدیمی استثناها کار میکنند. (مشارکتشده توسط ایریت کاتریل در bpo-46343.)عضو
PyConfig.safe_pathافزوده شد. (مشارکتشده توسط Victor Stinner در gh-57684.)
مهاجرت به پایتون 3.11¶
برخی ماکروها برای پرهیز از دامهای ماکرو، به توابع درونخطی ایستا تبدیلشدهاند. این تغییر باید عمدتاً از دید کاربران پنهان باشد، زیرا توابع جایگزین، برای پرهیز از هشدارهای کامپایلر ناشی از بررسیهای نوع ایستا، آرگومانهای خود را به نوعهای مورد انتظار تبدیل نوع میکنند. با این حال، وقتی C API محدود روی >=3.11 تنظیمشده باشد، این تبدیلهای نوع انجام نمیشوند و فراخوانکنندگان باید آرگومانها را به نوعهای مورد انتظارشان تبدیل نوع کنند. برای جزئیات بیشتر به PEP 670 مراجعه کنید. (با مشارکت Victor Stinner و Erlend E. Aasland در gh-89653.)
تابع
PyErr_SetExcInfo()دیگر از آرگومانهایtypeوtracebackاستفاده نمیکند؛ مفسر اکنون این مقادیر را از نمونهی استثنا (آرگومانvalue) به دست میآورد. این تابع همچنان ارجاعهای هر سه آرگومان را میدزدد. (با مشارکت Irit Katriel در bpo-45711.)PyErr_GetExcInfo()اکنون فیلدهایtypeوtracebackنتیجه را از نمونهی استثنا (فیلدvalue) به دست میآورد. (مشارکتشده توسط Irit Katriel در bpo-45711.)_frozenیک فیلد جدیدis_packageدارد که نشان میدهد ماژول فریزشده یک بسته است یا خیر. پیشتر، مقدار منفی در فیلدsizeنشانگر این موضوع بود. اکنون فقط مقادیر نامنفی برایsizeاستفاده میشوند. (مشارکتشده توسط Kumar Aditya در bpo-46608.)_PyFrameEvalFunction()اکنون به جایPyFrameObject*،_PyInterpreterFrame*را بهعنوان پارامتر دوم خود میگیرد. برای جزئیات بیشتر دربارهی نحوهی استفاده از این نوع اشارهگر تابع، به PEP 523 مراجعه کنید.PyCode_New()وPyCode_NewWithPosOnlyArgs()اکنون یک آرگومان اضافیexception_tableدریافت میکنند. تا حد امکان باید از استفاده از این توابع پرهیز کرد. برای به دست آوردن یک شیء کد سفارشی: یک شیء کد با استفاده از کامپایلر بسازید، سپس نسخهی اصلاحشدهی آن را با متدreplaceبه دست آورید.PyCodeObjectدیگر فیلدهایco_code،co_varnames،co_cellvarsوco_freevarsرا ندارد. در عوض، برای دسترسی به آنها از طریق API زبان C، به ترتیب ازPyCode_GetCode()،PyCode_GetVarnames()،PyCode_GetCellvars()وPyCode_GetFreevars()استفاده کنید. (مشارکت Brandt Bucher در bpo-46841 و Ken Jin در gh-92154 و gh-94936.)ماکروهای قدیمی سطل زباله (trashcan) (
Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) اکنون منسوخ شدهاند. آنها باید با ماکروهای جدیدPy_TRASHCAN_BEGINوPy_TRASHCAN_ENDجایگزین شوند.تابع tp_dealloc که ماکروهای قدیمی را دارد، مانند:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
باید به ماکروهای جدید به شرح زیر مهاجرت کنند:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
توجه داشته باشید که
Py_TRASHCAN_BEGINآرگومان دومی دارد که باید تابع تخصیصزدایی باشد؛ تابعی که این ماکرو در آن قرار دارد.برای پشتیبانی از نسخههای قدیمیتر پایتون در همان پایگاه کد (codebase)، میتوانید ماکروهای زیر را تعریف کنید و در سراسر کد از آنها استفاده کنید (منبع: این ماکروها از پایگاه کد
mypyکپی شدهاند):#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
تابع
PyType_Ready()اکنون هنگامی خطا ایجاد میکند که نوعی با پرچمPy_TPFLAGS_HAVE_GCتنظیمشده تعریف شود، اما تابع پیمایش (PyTypeObject.tp_traverse) نداشته باشد. (مشارکتشده توسط Victor Stinner در bpo-44263.)نوعهای هیپ با پرچم
Py_TPFLAGS_IMMUTABLETYPEاکنون میتوانند پروتکل فراخوانی برداری (vectorcall) PEP 590 را به ارث ببرند. پیشتر، این تنها برای نوعهای ایستا امکانپذیر بود. (مشارکتشده توسط Erlend E. Aasland در bpo-43908)از آنجا که
Py_TYPE()به یک تابع ایستای درونخطی تغییر یافته است،Py_TYPE(obj) = new_typeباید باPy_SET_TYPE(obj, new_type)جایگزین شود: تابعPy_SET_TYPE()را ببینید (از پایتون 3.9 به بعد در دسترس است). برای سازگاری با نسخههای پیشین، میتوان از این ماکرو استفاده کرد:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = type; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(مشارکتشده توسط Victor Stinner در bpo-39573.)
از آنجا که
Py_SIZE()به یک تابع ایستای درونخطی تبدیل شده است، عبارتPy_SIZE(obj) = new_sizeباید باPy_SET_SIZE(obj, new_size)جایگزین شود: تابعPy_SET_SIZE()را ببینید (از پایتون 3.9 در دسترس است). برای سازگاری با نسخههای پیشین، میتوان از این ماکرو استفاده کرد:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) #endif
(مشارکتشده توسط Victor Stinner در bpo-39573.)
وقتی ماکروی
Py_LIMITED_APIروی0x030b0000(پایتون 3.11) یا بالاتر تنظیم شده باشد،<Python.h>دیگر پروندههای سرآیند<stdlib.h>،<stdio.h>،<errno.h>و<string.h>را شامل نمیشود. ماژولهای توسعهای C باید پس از#include <Python.h>پروندههای سرآیند را بهطور صریح گنجانند. (مشارکتشده توسط Victor Stinner در bpo-45434.)پروندههای API غیرمحدود
cellobject.h،classobject.h،code.h،context.h،funcobject.h،genobject.hوlongintrepr.hبه پوشهیInclude/cpythonمنتقل شدهاند. علاوه بر این، پروندهی سرآیندeval.hحذف شد. این پروندهها نباید مستقیماً گنجانده شوند، زیرا از قبل درPython.hگنجانده شدهاند: Include Files. اگر این پروندهها مستقیماً گنجانده شدهاند، بهجای آنهاPython.hرا بگنجانید. (مشارکتشده توسط Victor Stinner در bpo-35134.)ماکروی
PyUnicode_CHECK_INTERNED()از API محدود C حذف شده است. این ماکرو هرگز در آنجا قابل استفاده نبود، زیرا از ساختارهای داخلیای استفاده میکرد که در API محدود C در دسترس نیستند. (مشارکتشده توسط Victor Stinner در bpo-46007.)توابع و نوع فریم زیر اکنون بهطور مستقیم با
#include <Python.h>در دسترس هستند و دیگر نیازی به افزودن#include <frameobject.h>نیست:(مشارکتشده توسط Victor Stinner در gh-93937.)
اعضای ساختار
PyFrameObjectاز API عمومی C حذف شدهاند.اگرچه مستندات اشاره میکند که فیلدهای
PyFrameObjectممکن است در هر زمان تغییر کنند، این فیلدها مدتهاست پایدار بودهاند و در چندین توسعهی محبوب استفاده شدهاند.در پایتون 3.11، ساختار فریم بازآرایی شد تا بهینهسازیهای کارایی ممکن شود. برخی از فیلدها بهطور کامل حذف شدند، زیرا جزئیاتی از پیادهسازی قدیمی بودند.
فیلدهای
PyFrameObject:f_back: ازPyFrame_GetBack()استفاده کنید.f_blockstack: حذف شد.f_builtins: ازPyFrame_GetBuiltins()استفاده کنید.f_code: ازPyFrame_GetCode()استفاده کنید.f_gen: ازPyFrame_GetGenerator()استفاده کنید.f_globals: ازPyFrame_GetGlobals()استفاده کنید.f_iblock: حذف شد.f_lasti: ازPyFrame_GetLasti()استفاده کنید. کدهایی که ازf_lastiبههمراهPyCode_Addr2Line()استفاده میکنند، باید بهجای آن ازPyFrame_GetLineNumber()استفاده کنند؛ ممکن است سریعتر باشد.f_lineno: ازPyFrame_GetLineNumber()استفاده کنیدf_locals: ازPyFrame_GetLocals()استفاده کنید.f_stackdepth: حذف شد.f_state: API عمومی ندارد (بهf_frame.f_stateتغییر نام داده شد).f_trace: API عمومی ندارد.f_trace_lines: ازPyObject_GetAttrString((PyObject*)frame, "f_trace_lines")استفاده کنید.f_trace_opcodes: ازPyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")استفاده کنید.f_localsplus: API عمومی ندارد (تغییر نام یافته بهf_frame.localsplus).f_valuestack: حذف شد.
شیء فریم پایتون اکنون بهصورت تنبل ایجاد میشود. یک اثر جانبی این است که نباید به عضو
f_backبهطور مستقیم دسترسی پیدا کرد، زیرا مقدار آن نیز اکنون بهصورت تنبل محاسبه میشود. در عوض، باید تابعPyFrame_GetBack()فراخوانی شود.اشکالزداهایی که مستقیماً به
f_localsدسترسی داشتند، باید به جای آنPyFrame_GetLocals()را فراخوانی کنند. آنها دیگر نیازی به فراخوانیPyFrame_FastToLocalsWithError()یاPyFrame_LocalsToFast()ندارند؛ در واقع نباید آن توابع را فراخوانی کنند. بهروزرسانی لازم فریم اکنون توسط ماشین مجازی مدیریت میشود.کدی که
PyFrame_GetCode()را در پایتون 3.8 و قدیمیتر تعریف میکند:#if PY_VERSION_HEX < 0x030900B1 static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(frame->f_code); return frame->f_code; } #endif
کدی که
PyFrame_GetBack()را در پایتون 3.8 و نسخههای قدیمیتر تعریف میکند:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(frame->f_back); return frame->f_back; } #endif
یا برای به دست آوردن این دو تابع در نسخههای قدیمیتر پایتون، از پروژهی pythoncapi_compat استفاده کنید.
تغییرات اعضای ساختار
PyThreadState:frame: حذف شد؛ ازPyThreadState_GetFrame()استفاده کنید (تابعی که با bpo-40429 به پایتون 3.9 افزوده شد). هشدار: این تابع یک ارجاع قوی برمیگرداند؛ بایدPy_XDECREF()را فراخوانی کنید.tracing: تغییر کرده است؛ ازPyThreadState_EnterTracing()وPyThreadState_LeaveTracing()استفاده کنید (توابعی که با bpo-43760 به پایتون 3.11 اضافه شدند).recursion_depth: حذف شد؛ بهجای آن از(tstate->recursion_limit - tstate->recursion_remaining)استفاده کنید.stackcheck_counter: حذف شد.
کدی که
PyThreadState_GetFrame()را در پایتون 3.8 و قدیمیتر تعریف میکند:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) { Py_XINCREF(tstate->frame); return tstate->frame; } #endif
کدی که
PyThreadState_EnterTracing()وPyThreadState_LeaveTracing()را در پایتون 3.10 و قدیمیتر تعریف میکند:#if PY_VERSION_HEX < 0x030B00A2 static inline void PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = 0; #else tstate->use_tracing = 0; #endif } static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) { int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->tracing--; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = use_tracing; #else tstate->use_tracing = use_tracing; #endif } #endif
یا برای دریافت این توابع در توابع پایتون قدیمی، از پروژهی pythoncapi-compat استفاده کنید.
توزیعکنندگان تشویق میشوند که پایتون را با کتابخانه بهینهشده Blake2 با نام libb2 بسازند.
اکنون باید فیلد
PyConfig.module_search_paths_setروی 1 تنظیم شود تا مقداردهی اولیه ازPyConfig.module_search_pathsبرای مقداردهی اولیهیsys.pathاستفاده کند. در غیر این صورت، مقداردهی اولیه مسیر را دوباره محاسبه خواهد کرد و هر مقداری را که بهmodule_search_pathsافزوده شده باشد جایگزین خواهد کرد.PyConfig_Read()دیگر مسیر جستجوی اولیه را محاسبه نمیکند و هیچ مقداری را درPyConfig.module_search_pathsقرار نمیدهد. برای محاسبهی مسیرهای پیشفرض و سپس تغییر آنها، بوتاسترپ را به پایان برسانید و با استفاده ازPySys_GetObject()،sys.pathرا بهعنوان یک شیء فهرست پایتونی بازیابی کنید و آن را مستقیماً تغییر دهید.
منسوخ¶
توابع زیر برای پیکربندی راهاندازی پایتون منسوخ شدهاند:
PySys_AddWarnOptionUnicode()PySys_AddWarnOption()PySys_AddXOption()PySys_HasWarnOptions()PySys_SetArgvEx()PySys_SetArgv()PySys_SetPath()Py_SetPath()Py_SetProgramName()Py_SetPythonHome()Py_SetStandardStreamEncoding()_Py_SetProgramFullPath()
به جای آن از API جدید
PyConfigدر پیکربندی مقداردهی اولیه پایتون استفاده کنید (PEP 587). (مشارکتشده توسط Victor Stinner در gh-88279.)عضو
ob_shashازPyBytesObjectمنسوخ شد. به جای آن ازPyObject_Hash()استفاده کنید. (مشارکتشده توسط Inada Naoki در bpo-46864.)
در انتظار حذف در پایتون 3.12¶
APIهای C زیر در نسخههای پیشین پایتون منسوخ شدهاند و در پایتون 3.12 حذف خواهند شد.
PyUnicode_AS_DATA()PyUnicode_AS_UNICODE()PyUnicode_AsUnicodeAndSize()PyUnicode_AsUnicode()PyUnicode_FromUnicode()PyUnicode_GET_DATA_SIZE()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_IS_COMPACT()PyUnicode_IS_READY()PyUnicode_WSTR_LENGTH()_PyUnicode_AsUnicode()PyUnicode_WCHAR_KINDPyUnicode_InternImmortal()
حذفشده¶
PyFrame_BlockSetup()وPyFrame_BlockPop()حذف شدهاند. (مشارکتشده توسط مارک شنون در bpo-40222.)ماکروهای ریاضی زیر با استفاده از متغیر
errnoحذف شدند:Py_ADJUST_ERANGE1()Py_ADJUST_ERANGE2()Py_OVERFLOWED()Py_SET_ERANGE_IF_OVERFLOW()Py_SET_ERRNO_ON_MATH_ERROR()
(مشارکتشده توسط Victor Stinner در bpo-45412.)
ماکروهای
Py_UNICODE_COPY()وPy_UNICODE_FILL()که از پایتون 3.3 منسوخ شده بودند، حذف شدند. بهجای آنها از توابعPyUnicode_CopyCharacters()یاmemcpy()(رشتهیwchar_t*) وPyUnicode_Fill()استفاده کنید. (مشارکتشده توسط ویکتور استینر در bpo-41123.)پروندهی سرآیند
pystrhex.hحذف شد. این پرونده فقط شامل توابع خصوصی است. افزونههای C باید فقط پروندهی سرآیند اصلی<Python.h>را شامل کنند. (مشارکتشده توسط Victor Stinner در bpo-45434.)ماکروی
Py_FORCE_DOUBLE()حذف شد. این ماکرو توسط ماکرویPy_IS_INFINITY()استفاده میشد. (مشارکتشده توسط Victor Stinner در bpo-45440.)موارد زیر هنگامی که
Py_LIMITED_APIتعریف شده باشد، دیگر در دسترس نیستند:ماکروی
Py_MARSHAL_VERSION
اینها بخشی از API محدود نیستند.
(مشارکتشده توسط Victor Stinner در bpo-45474.)
حذف
PyWeakref_GET_OBJECT()از C API محدود. این تابع هرگز کار نمیکرد، زیرا ساختارPyWeakReferenceدر C API محدود مات است. (مشارکتشده توسط Victor Stinner در bpo-35134.)ماکرو
PyHeapType_GET_MEMBERS()حذف شد. این ماکرو به اشتباه در API عمومی C افشا شده بود و تنها باید بهصورت داخلی توسط پایتون استفاده شود. در عوض از عضوPyTypeObject.tp_membersاستفاده کنید. (مشارکتشده توسط Victor Stinner در bpo-40170.)ماکروی
HAVE_PY_SET_53BIT_PRECISIONحذف شد (به API داخلی C منتقل شد). (با مشارکت Victor Stinner در bpo-45412.)
APIهای کدگذارِ
Py_UNICODEحذف شدند، زیرا از پایتون 3.3 منسوخ شدهاند، کم استفاده میشوند و نسبت به جایگزینهای توصیهشده ناکارآمد هستند.توابع حذفشده عبارتاند از:
PyUnicode_Encode()PyUnicode_EncodeASCII()PyUnicode_EncodeLatin1()PyUnicode_EncodeUTF7()PyUnicode_EncodeUTF8()PyUnicode_EncodeUTF16()PyUnicode_EncodeUTF32()PyUnicode_EncodeUnicodeEscape()PyUnicode_EncodeRawUnicodeEscape()PyUnicode_EncodeCharmap()PyUnicode_TranslateCharmap()PyUnicode_EncodeDecimal()PyUnicode_TransformDecimalToASCII()
برای جزئیات و راهنمای مهاجرت، به PEP 624 و راهنمای مهاجرت مراجعه کنید. (مشارکتشده توسط Inada Naoki در bpo-44029.)
تغییرات قابل توجه در 3.11.4¶
tarfile¶
متدهای استخراج در
tarfileوshutil.unpack_archive()یک آرگومان filter جدید دارند که اجازه میدهد قابلیتهای tar که ممکن است تعجبآور یا خطرناک باشند، مانند ایجاد پروندهها خارج از پوشهی مقصد، محدود شوند. برای جزئیات به فیلترهای استخراج مراجعه کنید. در پایتون 3.12، استفاده بدون آرگومان filter یکDeprecationWarningنمایش خواهد داد. در پایتون 3.14، مقدار پیشفرض به'data'تغییر خواهد کرد. (مشارکتشده توسط Petr Viktorin در PEP 706.)
تغییرات قابل توجه در 3.11.5¶
OpenSSL¶
نسخههای ویندوز و نصبکنندههای macOS از python.org اکنون از OpenSSL 3.0 استفاده میکنند.