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.14 تازههای پایتون 3.14¶
این مقاله ویژگیهای جدید پایتون 3.14 را در مقایسه با 3.13 توضیح میدهد. پایتون 3.14 در تاریخ ۷ اکتبر ۲۰۲۵ منتشر شد. برای جزئیات کامل، فهرست تغییرات را ببینید. همچنین ببینید PEP 745 -- زمانبندی انتشار پایتون 3.14 خلاصه -- نکات برجسته انتشار¶پایتون ۳.۱۴ یک انتشار پایدار از زبان برنامهنویسی پایتون است که شامل ترکیبی از تغییرات در زبان، پیادهسازی و کتابخانهی استاندارد میشود. بزرگترین تغییرات شامل محتواهای رشتهای قالببندیشده، ارزیابی معوق حاشیهنویسیها، و پشتیبانی از زیرمفسرها در کتابخانهی استاندارد است. تغییرات کتابخانه شامل بهبود چشمگیر قابلیتهای دروننگری در asyncio، پشتیبانی از Zstandard از طریق ماژول جدید این مقاله تلاش نمیکند مشخصات کامل همهی ویژگیهای جدید را ارائه دهد، بلکه در عوض مروری مناسب از آنها فراهم میکند. برای جزئیات کامل به مستندات مراجعه کنید، از جمله مرجع کتابخانه و مرجع زبان. برای درک پیادهسازی کامل و منطق طراحی یک تغییر، به PEP مربوط به ویژگی جدید موردنظر مراجعه کنید؛ اما توجه داشته باشید که PEPها معمولاً پس از آنکه یک ویژگی بهطور کامل پیادهسازی شد، بهروز نگه داشته نمیشوند. برای راهنمایی درباره ارتقا از نسخههای پیشین پایتون، Porting to Python 3.14 را ببینید. بهبودهای مفسر: بهبودهای چشمگیر در کتابخانه استاندارد:
بهبودهای C API: پشتیبانی از پلتفرم:
تغییرات انتشار: قابلیتهای جدید¶PEP 649 و PEP 749: ارزیابی معوق حاشیهنویسیها¶حاشیهنویسیهای توابع، کلاسها و ماژولها دیگر بهطور فوری ارزیابی نمیشوند. در عوض، حاشیهنویسیها در توابع ویژهی حاشیهنویسی ذخیره میشوند و فقط هنگام نیاز ارزیابی میشوند (مگر اینکه از این تغییر بهگونهای طراحی شده است که در بیشتر موارد کارایی و کاربردپذیری حاشیهنویسیها را در پایتون بهبود بخشد. هزینه رانتایم تعریف حاشیهنویسیها به حداقل رسیده است، اما همچنان میتوان حاشیهنویسیها را در زمان اجرا بازرسی کرد. اگر حاشیهنویسیها شامل ارجاع پیشرو باشند، دیگر لازم نیست آنها را درون رشته قرار دهید. ماژول جدید این مثال نشان میدهد که این قالبها چگونه رفتار میکنند: >>> from annotationlib import get_annotations, Format >>> def func(arg: Undefined): ... pass >>> get_annotations(func, format=Format.VALUE) Traceback (most recent call last): ... NameError: name 'Undefined' is not defined >>> get_annotations(func, format=Format.FORWARDREF) {'arg': ForwardRef('Undefined', owner=<function func at 0x...>)} >>> get_annotations(func, format=Format.STRING) {'arg': 'Undefined'} بخش انتقال شامل راهنماییهایی دربارهی تغییراتی است که ممکن است به دلیل این تغییرات لازم باشند، هرچند در اکثر موارد، کد بدون تغییر به کار خود ادامه خواهد داد. (مشارکتکرده توسط Jelle Zijlstra در PEP 749 و gh-119180؛ PEP 649 توسط Larry Hastings نوشته شد.) PEP 734: مفسرهای متعدد در کتابخانه استاندارد¶رانتایم سیپایتون از اجرای همزمان چند رونوشت از پایتون در یک فرایند واحد پشتیبانی میکند و بیش از ۲۰ سال است که این کار را انجام میدهد. هر یک از این رونوشتهای جداگانه «مفسر» نامیده میشود. با این حال، این قابلیت تنها از طریق C-API در دسترس بوده است. این محدودیت در پایتون 3.14 با ماژول جدید دستکم دو دلیل قابلتوجه وجود دارد که چرا استفاده از چند مفسر مزایای چشمگیری دارد:
برای برخی موارد استفاده، همروایی در نرمافزار در نگاه کلان کارایی را بهبود میبخشد و میتواند طراحی را سادهتر کند. در همان حال، پیادهسازی و نگهداری هر نوع همروایی به جز سادهترینها، اغلب برای مغز انسان تلاشی طاقتفرسا است. این موضوع بهویژه در مورد نخهای ساده صدق میکند (برای مثال، با چندین مفسر ایزوله، میتوانید از دستهای از مدلهای همزمانی، مانند فرایندهای ترتیبی ارتباطبرقرارکننده (CSP) یا مدل بازیگر (actor)، که در زبانهای برنامهنویسی دیگر مانند Smalltalk، Erlang، Haskell و Go به موفقیت دست یافتهاند، بهره ببرید. مفسرهای متعدد را مانند نخها در نظر بگیرید، اما با اشتراکگذاری اختیاری. دربارهی موازیسازی چندهستهای: از پایتون 3.12 به بعد، مفسرها اکنون به اندازهی کافی از یکدیگر جدا شدهاند تا بتوان از آنها به صورت موازی استفاده کرد (به PEP 684 مراجعه کنید). این امر انواعی از موارد استفادهی سنگین از نظر CPU را برای پایتون ممکن میسازد که توسط GIL محدود شده بودند. استفاده از چندین مفسر از بسیاری جهات شبیه به اگرچه این ویژگی چند دهه است که وجود دارد، اما مفسرهای چندگانه به دلیل آگاهی کم و نبود ماژولی در کتابخانه استاندارد، بهطور گسترده استفاده نشدهاند. در نتیجه، این مفسرها در حال حاضر چندین محدودیت قابل توجه دارند که انتظار میرود اکنون که این ویژگی به جریان اصلی تبدیل میشود، بهطور چشمگیری بهبود یابند. محدودیتهای فعلی:
تأثیر این محدودیتها به بهبودهای آتی سیپایتون، نحوه استفاده از مفسرها و مسائلی که کامیونیتی از طریق بستههای PyPI حل میکند، بستگی خواهد داشت. بسته به مورد استفاده، ممکن است این محدودیتها تأثیر چندانی نداشته باشند، پس آن را امتحان کنید! علاوه بر این، نسخههای آیندهی سیپایتون سربار را کاهش داده یا حذف خواهند کرد و ابزارهایی فراهم خواهند کرد که کمتر مناسب است در PyPI قرار بگیرند. در این میان، بیشترِ محدودیتها را میتوان از طریق ماژولهای توسعهای نیز برطرف کرد؛ به این معنا که بستههای PyPI میتوانند برای 3.14 هر شکافی را پر کنند و حتی تا 3.12، نسخهای که در آن مفسرها سرانجام بهدرستی جدا شدند و اشتراک قفل مفسر سراسری را متوقف کردند. به همین ترتیب، انتظار میرود کتابخانههایی در PyPI برای انتزاعهای سطح بالا بر فراز مفسرها پدیدار شوند. در مورد ماژولهای توسعهای، کار برای بهروزرسانی برخی پروژههای PyPI و همچنین ابزارهایی مانند Cython، pybind11، nanobind و PyO3 در جریان است. مراحل جداسازی یک ماژول توسعهای در جداسازی ماژولهای توسعه آمده است. جداسازی یک ماژول با آنچه برای پشتیبانی از نخبندی آزاد لازم است، همپوشانی زیادی دارد؛ بنابراین کارهای جاری کامیونیتی در این حوزه به تسریع پشتیبانی از مفسرهای متعدد کمک خواهد کرد. همچنین در 3.14 افزوده شد: concurrent.futures.InterpreterPoolExecutor. (مشارکتشده توسط اریک اسنو در gh-134939.) همچنین ببینید PEP 750: مقادیر لفظی رشته قالبی¶رشتههای قالبی سازوکار جدیدی برای پردازش سفارشی رشتهها هستند. آنها سینتکس آشنای افاسترینگها را به اشتراک میگذارند، اما برخلاف افاسترینگها، بهجای یک برای نوشتن یک تیاسترینگ، بهجای پیشوند >>> variety = 'Stilton' >>> template = t'Try some {variety} cheese!' >>> type(template) <class 'string.templatelib.Template'> اشیاء >>> list(template) ['Try some ', Interpolation('Stilton', 'variety', None, ''), ' cheese!'] نوشتن (یا فراخوانی) کد برای پردازش نمونههای from string.templatelib import Interpolation def lower_upper(template): """Render static parts lowercase and interpolations uppercase.""" parts = [] for part in template: if isinstance(part, Interpolation): parts.append(str(part.value).upper()) else: parts.append(part.lower()) return ''.join(parts) name = 'Wenslydale' template = t'Mister {name}' assert lower_upper(template) == 'mister WENSLYDALE' از آنجا که نمونههای attributes = {'src': 'limburger.jpg', 'alt': 'lovely cheese'} template = t'<img {attributes}>' assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />' البته، کد پردازش قالب لازم نیست نتیجهای شبهرشته را بازگرداند. یک با وجود تیاسترینگها، توسعهدهندگان میتوانند سیستمهایی بنویسند که SQL را پاکسازی کنند، عملیات پوسته را بهصورت امن انجام دهند، گزارشگیری را بهبود بخشند، به ایدههای مدرن در توسعه وب (HTML، CSS و غیره) بپردازند و زبانهای اختصاصی دامنه (DSL) سبکوزن و سفارشی کسبوکار را پیادهسازی کنند. (مشارکتشده توسط Jim Baker، Guido van Rossum، Paul Everitt، Koudai Aono، Lysandros Nikolaou، Dave Peck، Adam Turner، Jelle Zijlstra، Bénédikt Tran و Pablo Galindo Salgado در gh-132661.) همچنین ببینید PEP 768: رابط امن اشکالزدای خارجی¶پایتون 3.14 یک رابط اشکالزدایی بدون سربار معرفی میکند که به اشکالزداها و پروفایلگیرها اجازه میدهد تا بهطور ایمن به فرایندهای در حال اجرای پایتون متصل شوند، بدون توقف یا راهاندازی مجدد آنها. این ارتقای قابل توجهی در قابلیتهای اشکالزدایی پایتون است، به این معنا که دیگر نیازی به جایگزینهای ناامن نیست. رابط جدید نقاط اجرای امن را برای اتصال کد اشکالزدا فراهم میکند، بدون آنکه مسیر اجرای عادی مفسر را تغییر دهد یا هیچ سرباری در رانتایم ایجاد کند. به همین دلیل، ابزارها اکنون میتوانند برنامههای پایتون را بهصورت بلادرنگ بررسی کرده و با آنها تعامل کنند؛ این قابلیتی حیاتی برای سیستمهای با دسترسیپذیری بالا و محیطهای تولید است. برای سهولت، این رابط در تابع import sys from tempfile import NamedTemporaryFile with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f: script_path = f.name f.write(f'import my_debugger; my_debugger.connect({os.getpid()})') # Execute in process with PID 1234 print('Behold! An offering:') sys.remote_exec(1234, script_path) این تابع امکان ارسال کد پایتون به یک فرایند هدف را فراهم میکند تا در نقطه اجرای ایمن بعدی اجرا شود. با این حال، نویسندگان ابزار همچنین میتوانند پروتکل را مستقیماً همانطور که در PEP توضیح داده شده پیادهسازی کنند؛ این PEP سازوکارهای زیرین مورد استفاده برای اتصال ایمن به فرایندهای در حال اجرا را تشریح میکند. رابط اشکالزدایی با در نظر گرفتن امنیت، با دقت طراحی شده است و شامل چندین سازوکار برای کنترل دسترسی است:
(مشارکتشده توسط پابلو گالیندو سالگادو، مت وازنیسکی و ایوونا استویانوویچ در gh-131591.) همچنین ببینید نوع جدیدی از مفسر¶نوع جدیدی از مفسر به سیپایتون افزودهشده است. این مفسر بهجای یک دستور این مفسر در حال حاضر فقط با Clang 19 و نسخههای جدیدتر روی معماریهای x86-64 و AArch64 کار میکند. با این حال، انتظار میرود یک نسخهی آینده از GCC نیز از آن پشتیبانی کند. این قابلیت فعلاً بهصورت اختیاری (opt-in) است. هنگام استفاده از مفسر جدید، فعال کردن بهینهسازی هدایتشده با پروفایل (profile-guided optimization) بهشدت توصیه میشود، زیرا این تنها پیکربندیای است که برای بهبود کارایی آزمایش و اعتبارسنجی شده است. برای اطلاعات بیشتر، نکته این نباید با بهینهسازی فراخوانی دنبالهای (tail call optimization) توابع پایتون اشتباه گرفته شود؛ این بهینهسازی در حال حاضر در سیپایتون پیادهسازی نشده است. این نوع جدید مفسر، از جزئیات داخلی پیادهسازی مفسر سیپایتون است. به هیچ وجه رفتار قابل مشاهدهی برنامههای پایتون را تغییر نمیدهد. میتواند کارایی آنها را بهبود بخشد، اما چیز دیگری را تغییر نمیدهد. (با مشارکت Ken Jin در gh-128563، همراه با ایدههایی دربارهی نحوهی پیادهسازی این مورد در سیپایتون از سوی Mark Shannon، Garrett Gu، Haoran Xu و Josh Haberman.) بهبودهای حالت نخآزاد¶حالت نخآزاد سیپایتون (PEP 703) که نخستینبار در 3.13 اضافه شد، در پایتون 3.14 بهطور قابل توجهی بهبود یافته است. پیادهسازی توصیفشده در PEP 703، از جمله تغییرات در C API، تکمیل شده است و راهکارهای موقت در مفسر با راهکارهای پایدارتر جایگزین شدند. مفسر تطبیقی تخصصساز (PEP 659) اکنون در حالت نخآزاد فعال شده است که در کنار بسیاری از بهینهسازیهای دیگر، کارایی آن را بهطور چشمگیری بهبود میبخشد. افت کارایی کد تکنخی در حالت نخآزاد اکنون، بسته به پلتفرم و کامپایلر C استفادهشده، حدود ۵ تا ۱۰ درصد است. از پایتون 3.14 به بعد، هنگام کامپایل کردن ماژولهای توسعهای برای نسخهی نخآزاد سیپایتون در ویندوز، متغیر پیشپردازندهی پرچم جدید پرچم جدید (با مشارکت Sam Gross، Matt Page، Neil Schemenauer، Thomas Wouters، Donghee Na، Kirill Podoprigora، Ken Jin، Itamar Oren، Brett Simmers، Dino Viehland، Nathan Goldbaum، Ralf Gommers، Lysandros Nikolaou، Kumar Aditya، Edgar Margffoy و بسیاری دیگر. برخی از این مشارکتکنندگان در استخدام متا هستند؛ شرکتی که همچنان منابع مهندسی قابلتوجهی برای پشتیبانی از این پروژه فراهم کرده است.) پیامهای خطای بهبودیافته¶
PEP 784: پشتیبانی از Zstandard در کتابخانه استاندارد¶بسته جدید ماژول جدید در اینجا مثالی از استفاده از ماژول جدید برای فشردهسازی برخی دادهها آمده است: from compression import zstd import math data = str(math.pi).encode() * 20 compressed = zstd.compress(data) ratio = len(compressed) / len(data) print(f"Achieved compression ratio of {ratio}") همانطور که میبینید، API شبیه به APIهای ماژولهای (مشارکتشده توسط Emma Harper Smith، Adam Turner، Gregory P. Smith، Tomas Roun، Victor Stinner و Rogdham در gh-132983.) همچنین ببینید قابلیتهای دروننگری asyncio¶رابط خط فرمان جدیدی برای بررسی فرایندهای در حال اجرای پایتون با استفاده از وظایف ناهمگام اضافه شد که از طریق زیرفرمان زیرفرمان برای مثال، با فرض این کد: import asyncio async def play_track(track): await asyncio.sleep(5) print(f'🎵 Finished: {track}') async def play_album(name, tracks): async with asyncio.TaskGroup() as tg: for track in tracks: tg.create_task(play_track(track), name=track) async def main(): async with asyncio.TaskGroup() as tg: tg.create_task( play_album('Sundowning', ['TNDNBTG', 'Levitate']), name='Sundowning') tg.create_task( play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']), name='TMBTE') if __name__ == '__main__': asyncio.run(main()) اجرای ابزار جدید بر روی فرایند در حال اجرا، جدولی مانند این تولید خواهد کرد: python -m asyncio ps 12345 tid task id task name coroutine stack awaiter chain awaiter name awaiter id ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 1935500 0x7fc930c18050 Task-1 TaskGroup._aexit -> TaskGroup.__aexit__ -> main 0x0 1935500 0x7fc930c18230 Sundowning TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050 1935500 0x7fc93173fa50 TMBTE TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050 1935500 0x7fc93173fdf0 TNDNBTG sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230 1935500 0x7fc930d32510 Levitate sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230 1935500 0x7fc930d32890 DYWTYLM sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50 1935500 0x7fc93161ec30 Aqua Regia sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50 یا درختی مانند این: python -m asyncio pstree 12345 └── (T) Task-1 └── main example.py:13 └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72 └── TaskGroup._aexit Lib/asyncio/taskgroups.py:121 ├── (T) Sundowning │ └── album example.py:8 │ └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72 │ └── TaskGroup._aexit Lib/asyncio/taskgroups.py:121 │ ├── (T) TNDNBTG │ │ └── play example.py:4 │ │ └── sleep Lib/asyncio/tasks.py:702 │ └── (T) Levitate │ └── play example.py:4 │ └── sleep Lib/asyncio/tasks.py:702 └── (T) TMBTE └── album example.py:8 └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72 └── TaskGroup._aexit Lib/asyncio/taskgroups.py:121 ├── (T) DYWTYLM │ └── play example.py:4 │ └── sleep Lib/asyncio/tasks.py:702 └── (T) Aqua Regia └── play example.py:4 └── sleep Lib/asyncio/tasks.py:702 اگر چرخهای در گراف await ناهمگام شناسایی شود (که میتواند نشاندهندهی یک مشکل برنامهنویسی باشد)، ابزار خطا ایجاد میکند و مسیرهای چرخهای که از ساخت درخت جلوگیری میکنند را فهرست میکند: python -m asyncio pstree 12345 ERROR: await-graph contains cycles - cannot print a tree! cycle: Task-2 → Task-3 → Task-2 (مشارکتشده توسط پابلو گالیندو، ووکاش لانگا، یوری سلیوانوف و مارتا گومز ماسیاس در gh-91048.) کنترل همزمانایمن هشدارها¶مدیر زمینهی (مشارکتشده توسط Neil Schemenauer و Kumar Aditya در gh-130010.) سایر تغییرات زبان¶
توکارها¶
خط فرمان و محیط¶
PEP 758: اجازه دادن به عبارتهای
|
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |