۳۰ آذر ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

بهترین ویژگی ها و اصلاحات جدید در پایتون ۳.۱۲

پیام‌های خطای بهتر، پشتیبانی از ابزارهای پروفایل لینوکس و بسیاری از پیشرفت‌ها در نوع اشاره پایتون به تازگی منتشر شده است. بیا یک نگاهی بیندازیم.

پیام‌های خطای بهتر، پشتیبانی از ابزارهای پروفایل لینوکس و بسیاری از پیشرفت‌ها در نوع اشاره پایتون به تازگی منتشر شده است. بیا یک نگاهی بیندازیم.

زبان برنامه نویسی پایتون هر سال نسخه‌های جدیدی را منتشر می‌کند، با نسخه بتای قفل‌شده در نیمه اول سال و انتشار نهایی در پایان سال.

Python 3.12 به تازگی منتشر شده است. توسعه دهندگان تشویق می شوند این آخرین نسخه را روی کدهای غیر تولیدی امتحان کنند، هم برای تأیید اینکه با برنامه های شما کار می کند و هم برای دریافت ایده ای از اینکه آیا کد شما از مجموعه ویژگی های جدید و بهبود عملکرد در این آخرین نسخه بهره می برد یا خیر.

در اینجا خلاصه ای از مهم ترین ویژگی های جدید در Python 3.12 و معنای آنها برای توسعه دهندگان پایتون آمده است.

پیام های خطای بهتر

پیام‌های خطا در نسخه‌های اخیر پایتون دقیق‌تر (موقعیت‌های دقیق در خطوط) و جزئیات بیشتر (پیشنهادات بهتر در مورد آنچه ممکن است اشتباه باشد) می‌شوند. پایتون ۳.۱۲ پیشرفت های اضافی را به همراه دارد:

  • پیشنهادات ماژول وجود ندارد (“آیا X را فراموش کردید وارد کنید؟”) اکنون شامل ماژول هایی از کتابخانه استاندارد می شود.
  • پیشنهادات خطای بهتری برای خطای نحوی رایج با import; برای مثال، import p from m خطایی را برمی‌گرداند که از شما می‌پرسد آیا منظور شما از m import p است.
  • خطاهای وارد کردن برای یک ماژول معین اکنون شامل پیشنهادهایی از فضای نام ماژول وارد شده از آن است. به عنوان مثال، اگر از thismodule import thisclass را امتحان کنید وقتی منظور شما ThisClass است، پیشنهادی برای ThisClass دریافت خواهید کرد.
  • پیشنهادات

  • NameError اکنون شامل self نیز می‌شود. که در داخل یک نمونه کلاس به نام اضافه می‌شود (به عنوان مثال، name 'speed' تعریف نشده است. آیا شما به معنای "سرعت خود" است؟). این به این دلیل است که حذف self برای متغیرهای مثال منبع رایج خطاها در نمونه‌های کلاس است.

محدودیت های کمتر در قالب بندی f-string

رشته‌های F، سیستم راحت پایتون برای انجام قالب‌بندی رشته‌ها، از نظر نحوه قالب‌بندی به شدت محدود بود. پایتون ۳.۱۲ بسیاری از این محدودیت ها را حذف می کند. تغییرات:

  • عبارات رشته F اکنون می توانند هر عبارت معتبر پایتون باشند.
  • عبارات رشته‌ای F اکنون می‌توانند حاوی همان نوع نقل قول‌هایی باشند که برای تنظیم خود رشته f استفاده می‌شوند. برای مثال، f"لیست خرید، {"، ".join(groceries)}" اکنون یک رشته f معتبر است.
  • عبارات رشته‌ای F اکنون می‌توانند عبارات چند خطی باشند، به شرطی که از قوانین یکسانی برای سایر عبارات چند خطی پیروی کنند (به عنوان مثال، استفاده از پرانتز برای اجازه دادن به عبارات برای گسترش چندین خط).
  • تعریف کاراکترهای بک اسلش و یونیکد اکنون در رشته های f مجاز است. می‌توانید از همه چیز، از کاراکترهای کنترلی ساده (\n) تا ارجاع به فضای نام یونیکد (\N{POUND SIGN}) استفاده کنید.
  • خطاهای درون عبارات f-string اکنون محل دقیق خطا را در داخل عبارت محصور نشان می دهد، نه فقط در خود عبارت. این کار ردیابی و عیب‌یابی خطاهای f-string را آسان‌تر می‌کند.
Rust فضای نام ویژگی تشخیصی را برای پیام های کامپایلر اضافه می کند

پشتیبانی از پروفایل لینوکس perf

ابزار نمایه ساز لینوکس که به طور گسترده مورد استفاده قرار می گیرد perf با پایتون کار می کند، اما فقط اطلاعات مربوط به آنچه در سطح C در زمان اجرا پایتون اتفاق می افتد را برمی گرداند. اطلاعات مربوط به عملکردهای واقعی برنامه پایتون نمایش داده نمی‌شود.

Python 3.12 حالت انتخاب کردن را فعال می کند اجازه می دهد perf برای جمع آوری جزئیات برنامه های پایتون، نه فقط زمان اجرا. انتخاب کردن را می توان در سطح محیط یا داخل یک برنامه پایتون با تابع sys.activate_stack_trampoline انجام داد.

نظارت سریع‌تر اشکال‌زدایی/پروفایل

اجرای یک پروفایلر یا پیوست کردن یک دیباگر به یک برنامه پایتون به شما دید و بینش نسبت به کارهایی که برنامه انجام می دهد می دهد. هزینه عملکرد نیز دارد. برنامه‌ها زمانی که از طریق یک اشکال‌زدا یا نمایه‌ساز اجرا می‌شوند، می‌توانند به اندازه یک مرتبه کندتر اجرا شوند.

PEP 669 قلاب‌هایی را برای رویدادهای شی کد فراهم می‌کند که نمایه‌سازها و اشکال‌زداها می‌توانند به آن متصل شوند، مانند به عنوان شروع یا پایان یک تابع. یک تابع تماس می تواند توسط یک ابزار ثبت شود تا هر زمان که چنین رویدادی ایجاد می شود، فعال شود. همچنان عملکردی برای نمایه‌سازی یا اشکال‌زدایی وجود خواهد داشت، اما تا حد زیادی کاهش می‌یابد.

پرتکل های بافر

پروتکل بافر پایتون راهی برای دسترسی به ناحیه خام حافظه که توسط بسیاری از اشیاء پایتون پیچیده شده است، مانند bytes یا bytearray فراهم می‌کند. اما بیشتر تعاملات با پروتکل بافر از طریق پسوندهای C اتفاق می افتد. تا به حال، برای کد پایتون این امکان وجود نداشته است که بداند آیا یک شی معین از پروتکل بافر پشتیبانی می کند یا اینکه کد را به عنوان سازگار با پروتکل تایپ کند.

PEP 688 روش‌های dunder جدیدی را برای اشیا پیاده‌سازی می‌کند که به کد پایتون اجازه می‌دهد با بافر کار کند. پروتکل این کار نوشتن اشیایی را در پایتون آسان‌تر می‌کند که بافرهای داده‌شان را نشان می‌دهند، به‌جای نوشتن آن اشیاء در C. یک شی memoryview برمی گرداند. روش __release_buffer__ برای آزادسازی حافظه مورد استفاده برای بافر استفاده می‌شود.

در حال حاضر، روش‌های PEP 688 راهی برای نشان دادن اینکه آیا بافر معین فقط خواندنی است یا نه، ندارند – که اگر با داده‌های یک شیء تغییرناپذیر مانند bytes اما درب برای افزودن آن ویژگی در صورت نیاز باز است.

بهبودهای تایپ

دستور نوع اشاره پایتون که در Python 3.5 اضافه شده است، به ابزارهای پرده‌بندی اجازه می‌دهد تا طیف گسترده‌ای از خطاها را زودتر تشخیص دهند. با هر نسخه جدید، تایپ کردن در پایتون ویژگی‌هایی را به دست می‌آورد که طیف وسیع‌تری از موارد استفاده را پوشش می‌دهد.

TypedDict

در پایتون ۳.۱۲، می‌توانید از TypedDict به عنوان منبع انواع برای اشاره به آرگومان‌های کلیدواژه مورد استفاده در یک تابع استفاده کنید. Unpack variadic generic، معرفی شده در نسخه ۳.۱۱، برای این مورد استفاده می شود. در اینجا یک مثال از PEP مربوطه آمده است:


class Movie(TypedDict):
    name: str
    year: int

def foo(**kwargs: Unpack[Movie]) -> None: ...

در اینجا، foo می‌تواند آرگومان‌های کلیدواژه نام‌ها و انواعی را که با محتوای فیلمname:str و مطابقت دارند، دریافت کند. year:int. یکی از سناریوهایی که در آن مفید است، توابع نوع اشاره است که آرگومان های اختیاری فقط برای کلمه کلیدی را بدون مقادیر پیش فرض می گیرند.

نحو پارامتر را تایپ کنید

نحو پارامتر نوع روش تمیزتری برای تعیین انواع در یک کلاس عمومی، تابع ارائه می‌کند. ، یا نام مستعار را تایپ کنید. در اینجا یک مثال از PEP گرفته شده است:


# the old method 

from typing import TypeVar

_T = TypeVar("_T")

def func(a: _T, b: _T) -> _T:
    ...

# the new type parameter method

def func[T](a: T, b: T) -> T:
    ...

با روش جدید، نیازی به وارد کردن TypeVar نیست. فقط می توان از نحو func[T] برای نشان دادن ارجاعات نوع عمومی استفاده کرد. همچنین می‌توان کران‌های نوع را مشخص کرد، مانند اینکه آیا یک نوع معین یکی از گروه‌هایی از انواع است، اگرچه چنین انواعی به خودی خود نمی‌توانند عمومی باشند. یک مثال func[T: (str,int)] است.

در نهایت، @override decorator جدید می‌تواند برای پرچم‌گذاری روش‌هایی استفاده شود که روش‌ها را لغو می‌کنند. والدین، به عنوان راهی برای اطمینان از هرگونه تغییر ایجاد شده در والدین در طول تغییر نام (تغییر نام یا حذف) در فرزندان او نیز منعکس می شود.

بهبودهای عملکرد

با Python 3.11، تعدادی از پروژه‌های متحد برای بهبود عملکرد Python با هر نسخه جدید به صورت جهشی انجام شد. بهبود عملکرد در Python 3.12 چندان چشمگیر نیست، اما همچنان قابل توجه است.

خط‌سازی درک مطلب

Comprehensions، نحوی که به شما امکان می‌دهد به‌سرعت فهرست‌ها، واژه‌نامه‌ها و مجموعه‌ها را بسازید، اکنون “داخلی” ساخته می‌شوند نه از طریق اشیاء موقت. سرعت برای این مورد در حدود ۱۱٪ برای یک مورد واقعی و تا دو برابر سریعتر برای یک میکرو بنچمارک است.

اشیاء جاودانه

هر شی در پایتون دارای یک تعداد مرجع است که تعداد دفعاتی که اشیاء دیگر به آن ارجاع می دهند را ردیابی می کند، از جمله اشیاء داخلی مانند هیچ. PEP 683 به اشیاء اجازه می دهد تا به عنوان “جاودانه” در نظر گرفته شوند، به طوری که هرگز تعداد مرجع خود را نداشته باشند تغییر کرد.

جاودانگی کردن اشیا پیامدهای قدرتمند دیگری برای پایتون در دراز مدت دارد. اجرای مقیاس‌بندی چند هسته‌ای و پیاده‌سازی بهینه‌سازی‌های دیگر (مانند را آسان‌تر می‌کند. اجتناب از کپی در نوشتن) که قبلاً اجرای آن دشوار بود.

اندازه های کوچکتر اشیا

با نسخه های قبلی پایتون، اندازه پایه یک شی ۲۰۸ بایت بود. اشیاء در چند نسخه اخیر پایتون چندین بار بازسازی شده اند تا آنها را کوچکتر کنند، که نه تنها به اشیاء بیشتری اجازه می دهد در حافظه زندگی کنند، بلکه به محلی بودن حافظه پنهان کمک می کند. از پایتون ۳.۱۲، اندازه پایه یک شی در حال حاضر ۹۶ بایت است – کمتر از نیمی از آنچه قبلا بود.

مترجمان فرعی

یکی از ویژگی‌های مورد انتظار پایتون مفسرهای فرعی است – توانایی داشتن چندین نمونه از یک مفسر، که هر کدام دارای GIL خاص خود هستند و در یک فرآیند پایتون در کنار یکدیگر اجرا می‌شوند. این یک گام بزرگ به سمت موازی سازی بهتر در پایتون خواهد بود.

با این حال، نسخه ۳.۱۲ فقط شامل موارد داخلی CPython است تا این امکان را فراهم کند. هنوز هیچ رابط کاربری نهایی برای مترجمان فرعی وجود ندارد. یک ماژول استاندارد کتابخانه، مفسران، برای انجام این کار در نظر گرفته شده است. اما اکنون قرار است در پایتون ۳.۱۳ ظاهر شود.

تغییرات اضافی

Python 3.12 علاوه بر تغییرات بزرگی که تاکنون مورد بحث قرار گرفته است، تغییرات کوچک بی‌شماری دیگر نیز ارائه می‌کند. این یک نگاه سریع است.

API ناپایدار

یک پروژه کلیدی در حال انجام، بازسازی اجزای داخلی CPython، به ویژه مجموعه های API آن است، به طوری که تعداد کمتری از عملکردهای سطح پایین CPython باید در معرض نمایش قرار گیرند. Python 3.12 سطح API ناپایدار را معرفی کرد. مجموعه API مشخصاً به‌عنوان احتمال تغییر بین نسخه‌ها علامت‌گذاری شده است. در نظر گرفته شده است که اکثر برنامه های افزودنی C از آن استفاده کنند، بلکه توسط ابزارهای سطح پایین مانند اشکال زدا یا کامپایلرهای JIT استفاده می شود.

منسوخ شدن و حذف کتابخانه استاندارد

در نسخه ۳.۱۱، تعدادی از ماژول‌های کتابخانه استاندارد که مدت‌هاست منسوخ شده‌اند (به اصطلاح باتری‌های مرده) برای حذف در پایتون ۳.۱۲ و ۳.۱۳ پرچم‌گذاری شده‌اند. در نسخه ۳.۱۲، یکی از بزرگترین حذف ها distutils بود که مدت هاست توسط setuptools حذف شده است. ماژول های دیگر حذف شده در این نسخه عبارت بودند از asynchat، asyncore (هر دو با asyncio جایگزین شدند)، و smtpd.

جمع آوری زباله

مکانیسم جمع‌آوری زباله پایتون (GC) می‌توانست هر زمان که یک شی تخصیص داده می‌شد، اجرا شود. از پایتون ۳.۱۲، GC فقط بر روی مکانیسم “Eval breaker” در حلقه بایت کد پایتون اجرا می شود – یعنی بین اجرای یک بایت کد و دیگری. همچنین هر زمان که مکانیسم کنترل سیگنال CPython فراخوانی شود، اجرا می شود. این امکان اجرای دوره ای GC را در یک تماس طولانی مدت با یک برنامه افزودنی C در خارج از زمان اجرا فراهم می کند.