تازههای پایتون ۳.۱۵: ایمپورت تنبل و کلی ابزار جدید
خلاصهٔ کاملتر
این سند رسمی، قابلیتهای جدید پایتون ۳.۱۵ رو نسبت به ۳.۱۴ توضیح میده. توجه کن که خودِ مستندات میگن این نسخه فعلاً پیشنویسه و تا زمان انتشار نهایی حسابی تغییر میکنه، پس ارزش داره دوباره سر بزنی.
مهمترین قابلیت، ایمپورت تنبل صریح (PEP 810) ـه. مشکل اینه که برنامههای بزرگ پایتون اغلب کند بالا میان، چون موقع ایمپورت یه ماژول، پایتون باید فایل رو پیدا کنه، از دیسک بخونه، به بایتکد کامپایل کنه و همه کد سطحبالا رو اجرا کنه؛ حتی اگه بیشترِ اون کد اصلاً تو اون اجرا استفاده نشه. تا حالا توسعهدهندهها این رو با بردن ایمپورتها داخل تابع دور میزدن که کد رو شلوغ و نگهداریش رو سخت میکرد.
حالا با کلیدواژه نرم (soft keyword) به اسم lazy، میتونی ایمپورت رو علامت بزنی تا پایتون بارگذاری واقعی ماژول رو تا اولین باری که اسمش استفاده میشه عقب بندازه. اینطوری هم همه ایمپورتها بالای فایل میمونن، هم فقط هزینه بارگذاری ماژولهایی رو میدی که واقعاً استفادهشون میکنی:
lazy import json
lazy from pathlib import Path
data = json.loads('{"key": "value"}') # json loads here
p = Path(".") # pathlib loads hereاگه بارگذاری یه ماژول تنبل شکست بخوره (مثلاً ماژول وجود نداشته باشه)، پایتون خطا رو سرِ اولین استفاده میده، نه موقع ایمپورت؛ و traceback هم محل دسترسی به اسم و هم خود دستور ایمپورت رو نشون میده. برای کنترل سراسری بدون دستزدن به کد هم آپشن خط فرمان -X lazy_imports و متغیر محیطی PYTHON_LAZY_IMPORTS اضافه شده. چند محدودیت هم هست: lazy فقط تو محدوده ماژول مجازه و استفادهش داخل تابع یا بلوک try/except خطای SyntaxError میده، و ایمپورتهای ستارهای و future هم نمیتونن تنبل باشن.
از قابلیتهای جالب دیگه، آنپکینگ تو comprehensionها (PEP 798) ـه. حالا تو list و set و dict comprehension و همینطور generator expression میتونی با * و ** آنپکینگ کنی، که یه جایگزین مستقیم برای comprehensionهای تودرتو و itertools.chain() به حساب میاد:
>>> lists = [[1, 2], [3, 4], [5]]
>>> [*L for L in lists]
[1, 2, 3, 4, 5]یه نوع داده تازه به اسم frozendict (PEP 814) به ماژول builtins اضافه شده که بعد از ساختهشدن قابل تغییر نیست و اگه همه کلید و مقدارهاش hashable باشن، خودش هم hashable میشه؛ ضمناً زیرکلاس dict نیست و مستقیم از object ارثبری میکنه. کلی ماژول استاندارد مثل json، copy، pickle و pprint هم بهروز شدن تا frozendict رو قبول کنن. کنارش یه نوع sentinel (PEP 661) هم برای ساختن مقدارهای نگهبانِ یکتا با نمایش تمیز اومده.
تو بخش ابزار، یه پکیج جدید به اسم profiling (PEP 799) همه ابزارهای پروفایلینگ داخلی رو زیر یه فضای نام منسجم جمع کرده: profiling.tracing برای ردیابی قطعی (که از cProfile جابهجا شده) و profiling.sampling که یه پروفایلر نمونهبرداری تازه به اسم Tachyon ـه. خود cProfile برای سازگاری بهعنوان alias میمونه، ولی ماژول profile منسوخ شده و تو پایتون ۳.۱۷ حذف میشه.
نویسنده میگه Tachyon برای دیباگ مشکلات کارایی تو محیط production عالیه، چون میتونه بدون تغییر کد یا ریاستارت به یه پراسس در حال اجرا وصل بشه و با سربار تقریباً صفر تا نرخ نمونهبرداری یک میلیون هرتز کار کنه. حالتهای مختلف اندازهگیری (زمان دیواری، زمان CPU، زمان نگهداری GIL) و خروجیهای متنوعی مثل flame graph تعاملی و فرمت سازگار با Firefox Profiler هم داره. در همین راستا، طبق PEP 831، حالا CPython بهصورت پیشفرض با frame pointer ساخته میشه تا unwind کردن استک برای پروفایلرها و ابزارهای دیباگ سطحسیستم سریعتر و قابلاعتمادتر باشه.
از بقیه تغییرات مهم، حالا پایتون طبق PEP 686 بهصورت پیشفرض از انکدینگ UTF-8 استفاده میکنه. کامپایلر JIT هم بهطور قابلتوجهی ارتقا پیدا کرده، باینریهای ۶۴ بیتی ویندوز از مفسر tail-calling استفاده میکنن، پیامهای خطا بهتر شدن و رنگ بیشتری هم به خروجی اضافه شده.
نکات کلیدی:
- ایمپورت تنبل صریح با کلیدواژه lazy بارگذاری ماژول رو تا اولین استفاده عقب میندازه تا استارتآپ سریعتر بشه
- نوع تغییرناپذیر frozendict و نوع sentinel به ماژول builtins اضافه شدن
- پکیج جدید profiling و پروفایلر نمونهبرداری Tachyon با سربار تقریباً صفر برای دیباگ production
- آنپکینگ با * و ** حالا تو comprehensionها و generator expressionها کار میکنه
- UTF-8 به انکدینگ پیشفرض تبدیل شده و کامپایلر JIT هم حسابی ارتقا پیدا کرده
- این سند فعلاً پیشنویسه و تا انتشار نهایی پایتون ۳.۱۵ تغییر میکنه




