برنامه‌نویسی

تغییرات Python 3.9


۳۰ مهر ۱۳۹۹
تغییرات Python 3.9

این موضوع واضح است که این نسخه شامل تغییراتی اساسی نسبت به نسخه‌های قبلی است و مسیر تکاملی پایتون، در واقع قدمی به سمت مسیری جدید خواهد بود. این مقاله شامل موارد زیر می‌شود:

  • مسیر جدید پایتون
    • تغییرات parser
    • تغییرات در چرخه توسعه
  • قابلیت‌های جدید
    • تعیین نوع دیتای متغیرها یا Type Hinting
    • متد‌های مرتبط با stringها یا String Methods
    • اتصال دیکشنری‌ها به یکدیگر یا Dictionary Unions

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

مسیر جدید پایتون

۲ تغییر اساسی در این بروزرسانی وجود دارد که ما هیچ گونه تاثیر چندانی از آن‌ها نخواهیم دید، اما تغییرات پایتون، به عنوان یک زبان برنامه‌نویسی را بررسی خواهیم کرد.

به صورت خلاصه، بخش تغییرات پایتون، شامل ۲ مورد زیر می‌شود:

  • محدودیت‌های parserهای پایتون
  • تغییرات کوچک اما زود به زود

LL و PEG

حدود ۳۰ سال پیش، Guido van Rossum، خالق پایتون، pgen، یکی از بخش‌های ابتدایی برای پایتون را نوشت. همچنین تا به امروز نیز به عنوان parser پایتون استفاده می‌شود.

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

این موضوع اساسا چنین چیزی را بیان می‌کند که توسعه پایتون محدود است، زیرا:

  • واضح بود که استفاده از یک token قواعد این زبان را محدود می‌کند.
  • در حال حاضر پایتون شامل گرامری بدون LL می‌شود که این موضوع را بیان می‌کند که parser فعلی از راه‌حل‌های بسیار زیاد و پیچیدگی بیش از حد در پراسس‌ها، استفاده می‌کند.
  • حتی با استفاده از این راه‌حل‌ها، تنها برخی از آن‌ها ممکن و کاربردی هستند. می‌توان قوانین را دور زد اما نمی‌توان آن‌ها را شکست و یا رعایت نکرد.
  • با استفاده از LL، سینتکس بازگشتی به چپ می‌تواند باعث ایجاد حلقه بی‌نهایت در درخت parse شود که همین موضوع منجر به stack overflow خواهد شد. این موضوع توسط خالق پایتون، در این لینک کاملا توضیح داده شده است.

ویژگی‌های parserهای مبتنی بر LL باعث ایجاد محدودیت و غیرممکن‌کردن ممکن‌ها در پایتون می‌شود. پایتون نسخه 3.9 این محدودیت‌ها را با توجه به parser جدید PEG که در PEP 617 ارائه شده، از بین برده است.

فورا ما این موضوع را متوجه نخواهیم شد اما هیچ تغییری تا قبل از انتشار نسخه 3.10 پایتون در parser جدید احساس نخواهد شد. اما بعد از آن پایتون از محدودیت LL خلاص خواهد شد.

چرخه توسعه

تا قبل از ارائه نسخه 3.9 پایتون، انتشار نسخه‌های مختلف آن در بازه‌های زمانی ۱۸ ماهه برنامه‌ریزی شده بود. اما حالا، شاهد این هستیم که این بازه به ۱۲ ماه کاهش پیدا کرده است (PEP 602) و به جای اینکه هر یک سال و نیم شاهد ارائه یک نسخه جدید باشیم، می‌توانیم سالی یکبار، نسخه‌ای جدید را دریافت کنیم و این یعنی:

برنامه زمانی انتشار نسخه‌های پایتون
برنامه زمانی انتشار نسخه‌های پایتون که از حالت انتشار ۱۸ ماهه به ۱۲ ماه تغییر پیدا کرده است.
  • انتشار نسخه‌های جدید، شامل قابلیت‌های کمتری خواهد بود.
  • ایجاد تغییرات تدریجی، اما ارائه قابلیت‌های جدید در نسخه‌های مختلف و فیکس‌کردن مشکلات سریع‌تر خواهد بود.
  • تقویم انتشار نسخه‌های جدید، استوارتر و قابل اطمینان‌تر خواهد بود و حالا این را می‌دانیم که در اکتبر هر سال، باید منتظر ارائه نسخه جدیدی از پایتون باشیم.

قابلیت‌های جدید

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

تعیین نوع دیتای متغیرها یا Type Hinting

این موضوع به سال ۲۰۰۸ بازمی‌گردد، زمانی که پایتون 3 یادداشت‌نویسی یا annotationها را برای توابع معرفی کرد، چیزی که باعث شکل‌گیری Type Hinting شد. این اتفاق شاید به اندازه کافی بزرگ و قدرتمند نبود، اما به نقطه آغازی برای این موضوع تبدیل شد.

وضعیت فعلی Type Hinting در پایتون
وضعیت فعلی Type Hinting در پایتون، نتیجه انباشته‌شدن و کنار هم قرار گرفتن اضافات و تغییرات مختلف در annotationها و typingها، در گذر زمان است.

به دنبال این موضوع سایر قابلیت‌های بیشتری نیز در گذر زمان اضافه شدند. اما حالا نسخه 3.9، تمام قابلیت‌های مختلف را با یک سینتکس جدید و مرتب برای ایجاد بهترین تغییرات و توسعه‌ها در پایتون، کنار هم قرار داده است.

به سادگی می‌توانیم نوع دیتایی که برای متغیر‌هایمان انتظار می‌رود را مشخص کنیم. اگر بعد از این کار چیزی بنویسیم که منطقی نباشد (مثلا یک رشته یا string را به یک عدد صحیح یا integer پاس دهیم)، ویرایشگرمان وجود چنین موضوعی را، به ما اعلام خواهد کرد و اجرای کد، هیچ خطایی را ایجاد نخواهد کرد (متاسفانه)، اما این موضوع به هنگام کار با کد‌های پیچیده مفید است. بیایید نگاهی به سینتکس جدید بیاندازیم.

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

تفاوت استفاده و عدم استفاده از Type Hinting
تصویر سمت چپ: عدم استفاده از Type Hinting تصویر سمت راست: پایتون 3.9 و استفاده از Type Hinting

با استفاده از قابلیت Type Hinting، به سادگی می‌توانیم با افزودن : int به بعد از پارامتر تابع، به هنگام تعریف آن، از مزیت اعلان خطا توسط ویرایشگر بهره‌مند شویم.

استفاده از Type Hinting و مشخص‌کردن نوع داده ورودی و خروجی
استفاده از Type Hinting و مشخص‌کردن نوع داده ورودی و خروجی

با استفاده از سینتکس -> type به هنگام تعریف تابع، می‌توانیم نوع داده خروجی را تعیین کنیم.

استفاده از Type Hinting برای نوع داده‌های پیچیده‌تر
می‌توانیم از Type Hinting برای تعریف نوع داده‌های پیچیده‌تر نیز استفاده کنیم.

و در انتها به این نکته هم اشاره کنیم که در Type Hinting به نوع داده‌های ساده و اصلی محدود نیستیم!

متد‌های مرتبط با stringها یا String Methods

شاید این تغییر به اندازه سایر تغییرات، چشم‌گیر نباشد، اما دیده‌ایم که به دفعات زیاد استفاده شده است. در این نسخه، ۲ متد جدید برای حذف پیشوند و پسوند از stringها در اختیار داریم:

"foo bar".removeprefix("fo")
[Out]: 'o bar'

"foo bar".removesuffix("ar")
[Out]: 'foo b'

اتصال دیکشنری‌ها به یکدیگر یا Dictionary Unions

در این قسمت ۲ عملگر جدید در رابطه با اتصال یا اجرای Union بر روی دیکشنری‌ها را به شما معرفی کنیم.

اولین عملگر، عملگر ادغام یا merge است: |

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}
c = a | b

print(c)
[Out]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

و بعدی عملگر بروزرسانی یا update است، که عملیات ادغام یا merge را در یک جا انجام می‌دهد: |=

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}
a |= b

print(a)
[Out]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

نگاه به آینده

آینده جذابی برای پایتون، به عنوان یک زبان برنامه‌نویسی، وجود دارد. همچنین مشاهده‌ی نحوه‌ی تکامل یک زبان با یک برنامه زمان‌بندی جدید برای انتشار نسخه‌های و parserهای جدید، هیجان انگیز خواهد بود.

برای دانلود نسخه 3.9، به این لینک و همچنین برای مشاهده PEPهای جدید، ماژول‌های جدید و … (در واقع تمامی تغییرات و قابلیت‌های جدید) به این لینک مراجعه کنید.

منبع: https://towardsdatascience.com/python-3-9-9c2ce1332eb4