بررسی و خبر انتشار Python 3.15.0rc1؛ نسبت به پایتون 14 چی تغییر کرده؟
حدود ۱۴ دقیقه مطالعه
پایتون ۳.۱۵ وارد فاز release candidate شده و نسخهی 3.15.0rc1 چهارم آگوست منتشر شد. از این مرحله به بعد فقط باگفیکسهای تأییدشده اجازهی ورود دارن و قرار نیست تغییر ABI بیفته؛ یعنی چیزی که الان میبینی، تقریباً همون چیزیه که توی نسخهی نهایی هم خواهی داشت. طبق برنامه، rc2 اول سپتامبر منتشر میشه و نسخهی نهایی 3.15.0 هم اکتبر امسال بیرون میاد.
واردات تنبل (lazy imports)؛ شاید مهمترین فیچر این نسخه
با کلیدواژهی نرم lazy، حالا میتونی وارد کردن یه ماژول رو به تعویق بندازی تا وقتی که واقعاً بهش نیاز داری: lazy import json باعث میشه json فقط وقتی اولینبار استفاده بشه، واقعاً لود بشه. این دقیقاً همون کاری رو میکنه که خیلی از پروژههای بزرگ با import گذاشتن داخل توابع دستی انجام میدادن، ولی الان بهصورت رسمی و تمیز توی خود زبانه. یه فلگ خط فرمان (-X lazy_imports) و متغیر محیطی هم هست که میتونه همهی importها رو بهصورت global تنبل کنه، و یه تابع filter هم داری که میتونی مشخص کنی فقط ماژولهای خودت تنبل بشن و پکیجهای ثالث همونطور فوری لود بشن. برای اپلیکیشنهایی که زمان استارتاپشون طولانیه، این میتونه واقعاً محسوس باشه.
frozendict و sentinel به builtins اضافه شدن
یه نوع جدید به اسم frozendict مستقیم به builtins اضافه شده؛ برخلاف MappingProxyType، این یه کپی immutable واقعیه، نه فقط یه view روی دیکشنری قابلتغییر، و اگه کلید و مقدارهاش hashable باشن خودش هم hashable میشه. ماژولهایی مثل json، pickle و copy هم همین الان ازش پشتیبانی میکنن. در کنارش، یه تایپ sentinel هم اضافه شده که برای ساختن مقادیر یکتا (مثل الگوی رایج _MISSING = object()) استفاده میشه، ولی representation خواناتر و پشتیبانی از pickle داره.
پروفایلر جدید Tachyon و ماژول profiling
ابزارهای پروفایلینگ پایتون حالا زیر یه ماژول واحد به اسم profiling جمع شدن (profiling.tracing جایگزین cProfile قدیمیه و cProfile هم بهعنوان alias میمونه). نکتهی جالبتر، اضافه شدن یه statistical sampling profiler به اسم Tachyonه که میتونه بدون ریاستارت کردن پروسه و با overhead تقریباً صفر، به یه پروسهی در حال اجرا وصل بشه و تا سقف یک میلیون هرتز نمونهبرداری کنه؛ خروجیهایی مثل flamegraph تعاملی، فرمت Gecko برای Firefox Profiler، و حتی حالت زندهی شبیه top هم داره. برای دیباگ کردن مشکلات پرفورمنس روی سرورهای production که نمیشه راحت ریاستارتشون کرد، این ابزار واقعاً بهدردبخوره.
UTF-8 بهصورت پیشفرض همهجا
از این نسخه به بعد، وقتی encoding رو صریح مشخص نکنی (مثلاً توی open())، پایتون بهجای وابسته بودن به تنظیمات سیستمعامل، از UTF-8 استفاده میکنه. این یعنی رفتار یکسان روی ویندوز، مک و لینوکس، ولی اگه پروژهای داری که به رفتار قدیمی وابسته بوده، بهتره از PYTHONUTF8=0 برای برگردوندن رفتار قبلی استفاده کنی یا صریحاً encoding رو همیشه مشخص کنی.
لیست کامل تغییرات
این یه فهرست کامل و تفکیکشده از هر چیزیه که توی «What's New in Python 3.15» رسمی پایتون اومده؛ دقیقاً به همون دستهبندی خود مستندات.
ویژگیهای جدید زبان
- PEP 810 – واردات تنبل (lazy imports): کلیدواژهی نرم
lazyبرایimportوfrom ... import؛ لود شدن ماژول تا اولین استفاده به تعویق میفته. فلگ-X lazy_imports، متغیر محیطیPYTHON_LAZY_IMPORTS، توابعsys.set_lazy_imports()/get_lazy_imports()/set_lazy_imports_filter()و متغیر ماژولی__lazy_modules__هم اضافه شدن. فقط توی scope ماژول مجازه، نه داخل تابع یا کلاس. - PEP 814 – نوع built-in جدید
frozendict: دیکشنری immutable که زیرکلاسdictنیست، اگه کلید/مقدارهاش hashable باشن خودش هم hashable میشه. ماژولهایcopy،decimal،json،marshal،plistlib،pickle،pprintوxml.etree.ElementTreeازش پشتیبانی میکنن؛eval()/exec()هم برای globals قبولش میکنن. - PEP 661 – نوع built-in جدید
sentinel: برای ساختن مقادیر یکتا با representation خوانا؛ identity رو موقع کپی حفظ میکنه، با عملگر|توی type expression کار میکنه و قابل pickle شدنه. - PEP 799 – ماژول جدید
profiling: شاملprofiling.tracing(جایگزین cProfile، که بهعنوان alias میمونه) وprofiling.sampling. ماژول قدیمیprofileهم منسوخ شده و توی 3.17 حذف میشه. - پروفایلر Tachyon (
profiling.sampling): یه sampling profiler آماری با overhead تقریباً صفر، سرعت نمونهبرداری تا یک میلیون هرتز، حالتهای attach/run/dump، چهار مود اندازهگیری (wall/cpu/gil/exception)، خروجیهای pstats/collapsed/flamegraph/gecko/heatmap، حالت زندهی تعاملی (--live) و پروفایل async-aware و سطح opcode. - PEP 831 – فعال بودن پیشفرض frame pointer: کامپایل CPython با فلگهای
-fno-omit-frame-pointerو-mno-omit-leaf-frame-pointer، برای stack unwinding سریعتر و قابلاعتمادتر توسط پروفایلرها، دیباگرها و ابزارهای eBPF. از طریقsysconfigهم به extensionها منتقل میشه. - PEP 798 – Unpacking در comprehensionها:
*و**حالا توی list/set/dict comprehension و generator expression هم کار میکنن ([*L for L in lists]و مشابه). - PEP 829 – فایلهای پیکربندی استارتاپ پکیج (
.startfiles): جایگزین امنتر برای خطوطimportتوی فایلهای.pthکه کد دلخواه اجرا میکردن؛ فرمت جدیدpkg.mod:callable. کلاسsite.StartupStateهم برای batch کردن پردازش استارتاپ اضافه شده. - PEP 803/820/793 – Stable ABI برای buildهای free-threaded (
abi3t): امکان کامپایل extensionهای Stable ABI برای سازگاری با buildهای free-threaded، با API جدیدPyModExport_*و ساختارPySlot. - PEP 788 – محافظت C API در برابر finalization: APIهای جدید «interpreter guard» و «interpreter view» و مکانیزمهای attach/detach خودکار thread state؛ خانوادهی
PyGILStateهم soft-deprecated شده (بدون برنامهی حذف). - پیامهای خطای بهتر: پیشنهاد مسیر جایگزین توی
AttributeErrorوقتی attribute از طریق یه attribute داخلی در دسترسه؛ تشخیص متدهای زبانهای دیگه (مثل.push()جاوااسکریپتی) و پیشنهاد معادل پایتونی؛ پیشنهاد درdelattr()هم اضافه شده.
تغییرات دیگر زبان
- PEP 686 – UTF-8 بهعنوان انکودینگ پیشفرض: عملیات I/O بدون
encodingصریح، مستقل از سیستمعامل، از UTF-8 استفاده میکنن. باPYTHONUTF8=0یا-X utf8=0میشه رفتار قبلی رو برگردوند. - خروجی
python --helpرنگی شده. - Unraisable exceptionها بهصورت پیشفرض هایلایت رنگی میشن.
- رنگ بیشتر توی argparse، ast، calendar، difflib، http.server، pickletools، تکمیل تب PyREPL، sqlite3، timeit، tokenize و CLI کتابخانههای استاندارد دیگه.
repr()مربوط بهImportError/ModuleNotFoundErrorحالا name/path رو به شکلname=<name>نشون میده اگه بهصورت keyword داده شده باشن.- توصیفگرهای
__dict__و__weakref__حالا یه instance مشترک بین کلاسها دارن؛ سرعت ساخت کلاس رو بالا میبره. - گزینهی
-Wو متغیرPYTHONWARNINGSحالا regex هم قبول میکنن (اگه با/شروع و تموم بشن). - توابعی که timestamp/timeout میگیرن، هر عدد حقیقی (مثل
Decimal،Fraction) رو قبول میکنن، نه فقط int/float. - متد جدید
bytearray.take_bytes()برای خارج کردن بایتها بدون کپی. - توابع کامپایل/پارس مثل
compile()،ast.parse()،symtable.symtable()حالا اسم ماژول رو هم قبول میکنن (برای فیلتر کردن هشدارها). - تعریف
__dict__/__weakref__توی__slots__برای هر کلاسی مجاز شده؛ همینطور__slots__دلخواه برای زیرکلاسهایtuple(شاملnamedtuple). - نوع
sliceحالا generic شده و subscription قبول میکنه. memoryviewاز تایپهای C بهنامfloat complexوdouble complexپشتیبانی میکنه.- آرگومان
countتویbytes.replace()حالا میتونه keyword باشه. - علامت مثبت یگانه (unary plus) توی الگوهای literal بلوک
matchمجاز شده. - سیستم import حالا قفلهای per-module رو به ترتیب سلسلهمراتبی میگیره؛ یه deadlock قدیمی رفع شده.
- نام فایل extensionهای Stable ABI میتونه شامل multiarch tuple باشه (مثل
foo.abi3-x86-64-linux-gnu.so). - attribute منسوخشدهی
__cached__روی ماژولها دیگه در نظر گرفته نمیشه؛ بهجاش از__spec__.cachedاستفاده کن.
پوستهی تعاملی پیشفرض (REPL)
- تکمیل خودکار تب (tab completion) حالا بر اساس نوع شیء رنگی میشه (بر پایهی fancycompleter)؛ با
PYTHON_BASIC_COMPLETERمیشه بهrlcompleterقدیمی برگشت.
ماژولهای جدید
math.integer: توابع ریاضی مخصوص آرگومانهای صحیح (PEP 791).
بهبود ماژولها
- argparse:
BooleanOptionalActionاز گزینههای تکخطتیره و پیشوندهای جایگزین پشتیبانی میکنه؛suggest_on_errorپیشفرضشTrueشده؛ پشتیبانی از backtick برای هایلایت کد توی description/epilog و متن help. - array: پشتیبانی از
float complex/double complex(کدهایZf/Zd) و half-float (کدe)؛ نوعarray.typecodesازstrبهtupleتغییر کرده. - ast: پارامتر
colorبهdump()اضافه شده؛ خروجی CLI بهصورت پیشفرض syntax-highlighted شده. - asyncio: متد
TaskGroup.cancelبرای پایان زودهنگام یه گروه تسک اضافه شده. - base64: پارامتر
padدرz85encode()؛ پارامترpaddedدر توابع b32/b64؛ پارامترwrapcol؛ پارامترignorechars؛ پارامترcanonicalبرای رد کردن انکودینگهای غیراستاندارد. - binascii: توابع جدید Base32 (
b2a_base32/a2b_base32) و Ascii85/Base85/Z85؛ پارامترهایpadded،wrapcol،alphabet،ignorechars،canonical. - calendar: رنگ بیشتر توی CLI؛ خروجی HTML گزینهی year-month قبول میکنه؛ صفحات HTMLCalendar به HTML5 مهاجرت کردن و از دارکمود پشتیبانی میکنن.
- collections: متدهای
Counter.__xor__()/__ixor__()برای تفاضل متقارن. - concurrent.futures: گزارش خطای بهتر وقتی یه پروسهی فرزند توی
ProcessPoolExecutorناگهانی میمیره (PID و exit code رو نشون میده). - contextlib: پشتیبانی از descriptor دلخواه برای
__enter__/__exit__/__aenter__/__aexit__درExitStack/AsyncExitStack؛ContextDecorator/AsyncContextDecoratorحالا generator/coroutine/async-generator رو تشخیص میدن و context manager رو باز نگه میدارن. - ctypes: تغییر
_type_برای انواع complex ازF/D/GبهZf/Zd/Zg(سازگاری با NumPy). - dataclasses: annotationهای متد
__init__تولیدشده دیگه اسمهای داخلی رو نشون نمیدن. - dbm: متد جدید
reorganize()درdbm.dumbوdbm.sqlite3برای بازیابی فضای خالی. - difflib: پارامتر
colorدرunified_diff()؛ استایل بهتر و مهاجرت به HTML5 درHtmlDiff. - email: خطای صریح وقتی یه
EmailMessageبهخاطر آدرس غیر-ASCII قابل flatten کردن نیست. - faulthandler: پارامتر
max_threadsدر چند تابع. - functools:
singledispatchmethod()حالا از callableهای غیر-descriptor پشتیبانی میکنه و میتونه روی آرگومان دوم dispatch کنه. - gc: garbage collector افزایشی که توی 3.14.0-3.14.4 اومده بود، بهخاطر فشار حافظهی زیاد توی production به همون GC نسلی 3.13 برگردونده شده (از 3.14.5 به بعد هم همینه).
- hashlib: attributeهای hash function همیشهدردسترس، حتی اگه backend (مثل OpenSSL) نصب نباشه، دیگه
AttributeErrorنمیدن. - http.client: پارامتر keyword-only جدید
max_response_headers. - http.server: لاگ رنگی پیشفرض؛ پارامتر
default_content_typeو گزینهی--content-type؛extra_response_headersو گزینهی-H/--header. - importlib.metadata: حالا بهجای برگردوندن متادیتای خالی،
MetadataNotFoundرو raise میکنه اگه فایل متادیتا نباشه. - inspect: پارامترهای
inherit_class_docوfallback_to_class_docدرgetdoc(). - json: پارامتر
array_hookدرload()/loads()برای سفارشیسازی آرایهها؛ ترکیب باfrozendictبرای ساختار immutable تودرتو. - locale: پشتیبانی از
@-modifier تویsetlocale()/getlocale()؛getdefaultlocale()از حالت deprecated خارج شده. - math: توابع جدید
isnormal()،issubnormal()،fmax()،fmin()،signbit(). - mimetypes: MIME typeهای بیشتر؛ تغییر نام
application/x-texinfoبهapplication/texinfo؛ نوع MIME فایلهای.aiبهapplication/pdfتغییر کرده. - mmap: پارامتر
trackfdروی ویندوز؛ متدset_name()برای نامگذاری mapping ناشناس روی لینوکس ۵.۱۷ به بالا. - os: تابع جدید
os.statx()روی لینوکس؛ پارامترparent_modeدرmakedirs(). - os.path: پشتیبانی از حالت all-but-last در
realpath()؛ مقدار جدیدos.path.ALLOW_MISSINGبرای پارامترstrict. - pathlib: پارامتر
parent_modeدرPath.mkdir(). - pdb: استفاده از شل تعاملی جدید بهعنوان ورودی پیشفرض.
- pickle: پشتیبانی از pickle کردن متدهای private و کلاسهای تودرتو.
- pickletools: خروجی CLI رنگی پیشفرض.
- pprint: آرگومان
expandبرای فرمت شبیهjson.dumps؛ پشتیبانی از t-string. - re: توابع جدید
re.prefixmatch()/Pattern.prefixmatch()بهعنوان اسم صریحتر برایmatch()(که الان soft-deprecated شده). - resource: ثابتهای جدید
RLIMIT_NTHR،RLIMIT_UMTXP،RLIMIT_THREADS،RLIM_SAVED_CUR،RLIM_SAVED_MAX. - shelve: متد
reorganize()؛ پشتیبانی از توابع سریالسازی سفارشی. - socket: ثابتهای پروتکل ISO-TP CAN.
- sqlite3: تکمیل کلیدواژهی SQL با تب، پرامپتها و خطاهای رنگی، تکمیل نام جدول/ایندکس/تریگر/ویو/ستون/تابع/schema با تب توی CLI.
- ssl: ثابت
HAS_PSK_TLS13؛ متدهای جدید مدیریت گروههای key agreement (set_groups/get_groups/group())؛ متدset_ciphersuites()برای TLS 1.3؛ متدهای مدیریت الگوریتم امضا (get_sigalgs,set_client_sigalgs,set_server_sigalgsو...). - subprocess:
Popen.wait()با timeout حالا از مکانیزم event-driven کارآمدتر استفاده میکنه (pidfd+poll روی لینوکس، kqueue روی مک/BSD). - symtable: متدهای
Function.get_cells()وSymbol.is_cell(). - sys: namespace جدید
sys.abi_info. - sys.monitoring: رویدادهایی مثل
PY_THROW/PY_UNWIND/RAISEحالا بهصورت per-code-object قابل غیرفعالسازیان. - tarfile: چند اصلاحیهی امنیتی برای path traversal و symlink (چند CVE رفع شده)؛ رفتار بهتر با symlinkهای ویندوزی.
- threading: توابع
serialize_iterator،synchronized_iterator()،concurrent_tee()برای دسترسی همزمان به iterator/generator. - timeit: خروجی و traceback رنگی پیشفرض؛ تنظیم قابلکانفیگ زمان هدف
autorange()و گزینهی--target-time. - tkinter: آرگومانهای جدید
nolinestop/strictlimitsبرایText.search()؛ متدsearch_all()؛ متدهایpack_content()/place_content()/grid_content(). - tokenize: خروجی CLI رنگی پیشفرض.
- tomllib: پشتیبانی از TOML 1.1.0 (newline و trailing comma در inline table، نوتیشن
\xHH، ثانیهی اختیاری در datetime/time). - types: نوع
types.FrameLocalsProxyTypeبرای proxy مربوط بهframe.f_locals. - typing: PEP 747 (
TypeForm)، PEP 728 (آرگومانهایclosed/extra_itemsدرTypedDict)، PEP 800 (دکوریتور@typing.disjoint_base)؛ چند رفتار اشتباه قدیمی در ترتیب type parameter پروتکلها اصلاح شده؛TypeVarTupleحالاbound/covariant/contravariant/infer_varianceقبول میکنه. - unicodedata: آپدیت به Unicode 17.0.0؛ توابع
isxidstart()/isxidcontinue()،iter_graphemes()،grapheme_cluster_break()،indic_conjunct_break()،extended_pictographic()،block(). - unittest:
assertLogs()فرمتر قبول میکنه؛assertWarns()/assertWarnsRegex()دیگه هشدارهای غیرمرتبط رو قورت نمیدن و nested context manager هم پشتیبانی میشه. - urllib.parse: پارامتر
missing_as_noneدرurlsplit/urlparse/urldefrag؛ پارامترkeep_emptyدرurlunsplit/urlunparse. - venv: روی POSIX دایرکتوریهای platlib بهجای symlink
lib64 -> libساخته میشن. - warnings: فیلتر بهتر بر اساس ماژول در
warn_explicit()وقتی آرگومان module داده نشده. - wave: پشتیبانی از فرمت WAVE ممیز شناور (IEEE)؛ متدهای
getformat()/setformat()؛setparams()هم تاپل ۷تایی هم ۶تایی قبول میکنه. - webbrowser: روی مک، کلاس جدید
webbrowser.MacOSبهجای AppleScript از/usr/bin/openاستفاده میکنه؛ تشخیص مرورگر پیشفرض از فایل تنظیمات LaunchServices. - xml: توابع جدید
is_valid_name()وis_valid_text(). - xml.parsers.expat: توابع تنظیم آستانه برای محافظت در برابر مصرف حافظهی نامتناسب و حملات billion-laughs.
- zlib: توابع
adler32_combine()وcrc32_combine()برای ترکیب چکسامهای Adler-32 و CRC-32.
بهینهسازیها
mimallocallocator پیشفرض برای تخصیص حافظهی خام شده (بهبود پرفورمنس روی buildهای free-threaded).- پیادهسازی base64 حالا ۲ برابر سریعتر انکود و ۳ برابر سریعتر دیکود میکنه.
- پیادهسازی Ascii85/Base85/Z85 با C بازنویسی شده: دو مرتبه بزرگی سریعتر و کمحافظهتر.
- پیادهسازی Base32 هم با C بازنویسی شده و دو مرتبه بزرگی سریعتره.
- تشخیص delimiter در
csv.Sniffer.sniff()تا ۱.۶ برابر سریعتر شده. - JIT کامپایلر آپدیت مهمی خورده؛ طبق pyperformance حدود ۸ تا ۹ درصد بهبود کلی سرعت.
حذفشده، منسوخشده و تغییرات C API/Build
مستندات رسمی بخشهای جداگانهای هم برای «Removed»، «Deprecated»، «C API changes» و «Build changes» داره که جزئیاتش بیشتر برای نگهدارندههای افزونهها و پکیجهای C اهمیت داره تا کاربر معمولی پایتون؛ اگه پکیجی با extension بومی نگه میداری، حتماً قبل از آپگرید این بخشها رو توی مستندات رسمی خودشون چک کن.
جمعبندی
3.15.0rc1 دقیقاً همونیه که اسمش میگه؛ یه پیشنمایش تقریباً نهایی، نه یه نسخهی آزمایشی نصفهنیمه. اگه پکیجی نگه میداری که خیلیا ازش استفاده میکنن، الان بهترین زمانه که wheel های سازگار با 3.15 رو منتشر کنی و تست کنی. برای پروژهی production خودت هم بهتره صبر کنی تا نسخهی نهایی اکتبر بیاد؛ ولی چیزهایی مثل lazy imports و frozendict به اندازهی کافی جذاب هستن که ارزش یه تست زودهنگام رو داشته باشن.
