GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing python.github.io — تازههای پایتون 3.11 تازههای پایتون 3.11¶
این مقاله ویژگیهای جدید پایتون 3.11 را در مقایسه با 3.10 توضیح میدهد. پایتون 3.11 در تاریخ ۲۴ اکتبر ۲۰۲۲ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید. خلاصه -- نکات برجستهی انتشار¶
ویژگیهای نحوی جدید: قابلیتهای توکار جدید: ماژولهای جدید کتابخانه استاندارد: بهبودهای مفسر:
قابلیتهای جدید نوعدهی: منسوخسازیها، حذفها و محدودیتهای مهم:
ویژگیهای جدید¶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' نسخههای قبلی مفسر فقط به سطر اشاره میکردند، که باعث میشد مبهم باشد کدام شیء Traceback (most recent call last): File "query.py", line 37, in <module> magic_arithmetic('foo') File "query.py", line 18, in magic_arithmetic return add_counts(x) / 25 ^^^^^^^^^^^^^ File "query.py", line 24, in add_counts return 25 + query_user(user1) + query_user(user2) ^^^^^^^^^^^^^^^^^ File "query.py", line 32, in query_user return 1 + query_count(db, response['a']['b']['c']['user'], retry=True) ~~~~~~~~~~~~~~~~~~^^^^^ TypeError: 'NoneType' object is not subscriptable همچنین عبارتهای حسابی پیچیده: Traceback (most recent call last): File "calculation.py", line 54, in <module> result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero علاوه بر این، اطلاعات مورد استفاده در قابلیت ردگیری بهبودیافته از طریق یک API عمومی در دسترس قرار گرفته است که میتوان از آن برای برقراری تناظر میان دستورالعملهای bytecode و مکان کد منبع استفاده کرد. این اطلاعات را میتوان با استفاده از موارد زیر بازیابی کرد:
برای جزئیات بیشتر به PEP 657 مراجعه کنید. (مشارکتشده توسط Pablo Galindo، Batuhan Taskaya و Ammar Askar در bpo-43950.) نکته این قابلیت نیازمند ذخیرهسازی موقعیتهای ستون در اشیاء کد است که ممکن است به افزایش اندکی در مصرف حافظهی مفسر و مصرف دیسک برای پروندههای کامپایلشدهی پایتون منجر شود. برای پرهیز از ذخیرهسازی اطلاعات اضافی و غیرفعال کردن چاپ اطلاعات ردگیری اضافی، از گزینهی خط فرمان PEP 654: گروههای استثنا و
|
عملیات |
فرم |
تخصصیسازی |
افزایش سرعت عملیات (حداکثر) |
مشارکتکننده(ها) |
|---|---|---|---|---|
عملیات دودویی |
|
جمع، ضرب و تفریق دودویی برای نوعهای رایج مانند |
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.10 بیش از ۲۰٪ بیشتر باشد. این موضوع با بهینهسازیهای حافظه برای اشیاء فریم و دیکشنریهای شیء که در بالا ذکر شد، جبران میشود.
برخی کدها سودمندی محسوسی نخواهند داشت. اگر کد شما بیشتر زمان خود را صرف عملیات ورودی/خروجی (I/O) میکند، یا از قبل بیشتر محاسبات خود را در یک کتابخانه توسعهای C مانند NumPy انجام میدهد، افزایش سرعت چشمگیری حاصل نخواهد شد. این پروژه در حال حاضر بیشترین سود را به بارهای کاری پایتون خالص میرساند.
علاوه بر این، ارقام pyperformance یک میانگین هندسی هستند. حتی در میان بنچمارکهای pyperformance، برخی بنچمارکها اندکی کند شدهاند، در حالی که برخی دیگر تقریباً ۲ برابر سریعتر شدهاند!
خیر. ما همچنان در حال بررسی بهینهسازیهای دیگر هستیم.
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 حذف شوند:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(با مشارکت 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.)
APIهای پایتون زیر در نسخههای پیشین منسوخ شدهاند و در پایتون 3.12 حذف خواهند شد.
APIهای C که در انتظار حذف هستند، بهصورت جداگانه فهرست شدهاند.
ماژول asynchat
ماژول asyncore
ماژول imp
فضای نام typing.io
فضای نام typing.re
cgi.log()
importlib.find_loader()
importlib.abc.Loader.module_repr()
importlib.abc.MetaPathFinder.find_module()
importlib.abc.PathEntryFinder.find_loader()
importlib.abc.PathEntryFinder.find_module()
importlib.machinery.BuiltinImporter.find_module()
importlib.machinery.BuiltinLoader.module_repr()
importlib.machinery.FileFinder.find_loader()
importlib.machinery.FileFinder.find_module()
importlib.machinery.FrozenImporter.find_module()
importlib.machinery.FrozenLoader.module_repr()
importlib.machinery.PathFinder.find_module()
importlib.machinery.WindowsRegistryFinder.find_module()
importlib.util.module_for_loader()
importlib.util.set_loader_wrapper()
importlib.util.set_package_wrapper()
pkgutil.ImpImporter
pkgutil.ImpLoader
pathlib.Path.link_to()
sqlite3.enable_shared_cache()
sqlite3.OptimizedUnicode()
متغیر محیطی PYTHONTHREADDEBUG
نامهای مستعار منسوخِ زیر در unittest:
نام مستعار منسوخ
نام متد
منسوخ در
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 خارج شده و بهطور مستقل از درخت منبع پایتون در حال توسعه است.
این بخش، تغییرات پیشتر توضیح دادهشده و سایر رفع اشکالها در 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.)
تابع جدید 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.)
برخی ماکروها برای پرهیز از دامهای ماکرو، به توابع درونخطی ایستا تبدیلشدهاند. این تغییر باید عمدتاً از دید کاربران پنهان باشد، زیرا توابع جایگزین، برای پرهیز از هشدارهای کامپایلر ناشی از بررسیهای نوع ایستا، آرگومانهای خود را به نوعهای مورد انتظار تبدیل نوع میکنند. با این حال، وقتی 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.)
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_KIND
PyUnicode_InternImmortal()
PyFrame_BlockSetup() و PyFrame_BlockPop() حذف شدهاند. (مشارکتشده توسط مارک شنون در bpo-40222.)
ماکروهای ریاضی زیر با استفاده از متغیر errno حذف شدند:
Py_ADJUST_ERANGE1()
Py_ADJUST_ERANGE2()
Py_OVERFLOWED()
Py_SET_ERANGE_IF_OVERFLOW()
Py_SET_ERRNO_ON_MATH_ERROR()
(مشارکتشده توسط Victor Stinner در bpo-45412.)
ماکروهای Py_UNICODE_COPY() و Py_UNICODE_FILL() که از پایتون 3.3 منسوخ شده بودند، حذف شدند. بهجای آنها از توابع PyUnicode_CopyCharacters() یا memcpy() (رشتهی wchar_t*) و PyUnicode_Fill() استفاده کنید. (مشارکتشده توسط ویکتور استینر در bpo-41123.)
پروندهی سرآیند pystrhex.h حذف شد. این پرونده فقط شامل توابع خصوصی است. افزونههای C باید فقط پروندهی سرآیند اصلی <Python.h> را شامل کنند. (مشارکتشده توسط Victor Stinner در bpo-45434.)
ماکروی Py_FORCE_DOUBLE() حذف شد. این ماکرو توسط ماکروی Py_IS_INFINITY() استفاده میشد. (مشارکتشده توسط Victor Stinner در bpo-45440.)
موارد زیر هنگامی که Py_LIMITED_API تعریف شده باشد، دیگر در دسترس نیستند:
ماکروی Py_MARSHAL_VERSION
اینها بخشی از API محدود نیستند.
(مشارکتشده توسط Victor Stinner در bpo-45474.)
تابع PyWeakref_GET_OBJECT() از API محدود C حذف شد. این تابع هیچوقت کار نمیکرد زیرا ساختار PyWeakReference در API محدود C به صورت کدر (opaque) است. (مشارکتکرده توسط 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.)
متدهای استخراج در tarfile و shutil.unpack_archive() یک آرگومان filter جدید دارند که اجازه میدهد قابلیتهای tar که ممکن است تعجبآور یا خطرناک باشند، مانند ایجاد پروندهها خارج از پوشهی مقصد، محدود شوند. برای جزئیات به فیلترهای استخراج مراجعه کنید. در پایتون 3.12، استفاده بدون آرگومان filter یک DeprecationWarning نمایش خواهد داد. در پایتون 3.14، مقدار پیشفرض به 'data' تغییر خواهد کرد. (مشارکتشده توسط Petr Viktorin در PEP 706.)
نسخههای ویندوز و نصبکنندههای macOS از python.org اکنون از OpenSSL 3.0 استفاده میکنند.