همه مزیتهای پایتون 3.8
پایتون 3.7 دیگر قدیمی شده است. در نسخه 3.7 از نظر عملکردها و بهینهسازی، بهبودهایی انجام شده و این داستان در مورد 3.8 نیز ادامه خواهد داشت. در حال حاضر، بیشتر قابلیتهای جدید در توسعه ماژول C قرار دارد. بر اساس اظهارنظرهای انجامشده میتوان حدس زد که چه قابلیتهای جدیدی به نسخه 3.8 اضافهشده است. اما تمام این تحقیقها بهصورت پیشنویس (پروپوزال) بوده و بهعنوان تحقیقات انجامشده در سایت پایتون قابل دسترسی است و هنوز به صورت رسمی تحقیقی منتشر نشده است. در این مقاله قصد داریم با نگاهی به چند مورد از آنها ذهنیتی از ویژگیهای جدید پایتون کسب کنیم.
زمان راهاندازی سریعتر انجام میشود
مترجم پایتون همیشه کند بوده؛ حتی برای اسکریپتهای از پیش کاملشده و اگر چند پروسه را همزمان اجرا کنید ممکن است دچار مشکل شوید. همانطور که در شکل 2 میبینید پایتون 3 برای راهاندازی از 2.7 کندتر است و حتی PyPy نیز از آنها کندتر است.
شکل 2. زمان راهاندازی اولیه در نسخههای مختلف پایتون
تلاشهای بسیاری برای پیشرفت انجامشده، اما واقعیت این است که تاکنون هیچ تفاوت چشمگیری را مشاهده نکردهایم. بااینحال، به نظر میرسد که نسخه 3.8 حامل تغییرات بزرگی است. در یکی از تحقیقهای بیانشده (PEP432) پروسه راهاندازی به مراحل کوچکتر تقسیمشده، یعنی زمانیکه شما پایتون را از خط فرمان یا از یک فرآیند WSGI اجرا میکنید، مراحل راهاندازی اولیه شروع میشود؛ صرفنظر از اینکه آیا شما مایل به اجرا و تست برنامه هستید یا خیر؟
تحقیقات نشان داده است که دلیل کندی زمان راهاندازی پایتون به دلیل پیچیدگی در وارد کردن کتابخانههای متعدد این برنامه است. تحقیق دیگر درباره اینکه چگونه اسکریپتهای پیشساخته میتواند ورودیهای لازم و تنظیمات مورد نیاز را انجام دهد، نشان میدهد که این موضوع میتواند در زمان راهاندازی تفاوت زیادی ایجاد کند.
مترجمهای چندگانه
در ارتباط با زمان راهاندازی، پروپوزال شماره 554 یک ماژول کتابخانهایِ استانداردِ جدید را ارائه میدهد که میتواند از چندین مفسر پایتون بهجای یک مفسر برای یک پروسه استفاده کند.
همچنین این تحقیق توسعه این APIها را برای به اشتراکگذاری بهتر دادهها بین این مفسران پیشنهاد میدهد. در ادامه یک نمونه کد در این مورد مشاهده میکنید:
import interpreters
interp = interpreters.create()
print(‘before’)
interp.run(‘print(“during”)’)
print(‘after’)ییی
اپراتورهای ناشناس (None-Aware)
هر برنامهنویس C#، Perl، PHP یا Swift ممکن است با اپراتورهای ناشناس آشنا باشد که میتواند برای بسیاری از اهداف مورد استفاده قرار گیرد. یکی از اپراتورهای مورد علاقه برنامهنویسان برای C#، اپراتور سهجانبه ناشناس (Null-Aware Ternary) است. در این مثال، مقدار میوه به ارزش val اختصاص دادهشده است. وقتیکه مقدار آن Null باشد، در این صورت ارزش آن برابر Watermelon است.
var fruit = val ?? “watermelon”;
پروپوزال شماره 505 برای مقادیر None سه تعریف مترادف ارائه میدهد که شبیه این مثال C# هستند.
if val is None:
fruit = “watermelon”
else:
fruit = val
# بر اساس تحقیق 505 بهصورت زیر است
fruit = val ?? “watermelon”
برای دسترسی به صفتهای ناشناس بهصورت زیر است:
if val.fruit is not None:
fruit = val.fruit.name()
else:
# بر اساس تحقیق 505 بهصورت زیر است
fruit = val.fruit?.name()
و به همین ترتیب برای نشان دادن متغیری که مطمئن نیستید که مقداردهی شده باشد:
list_of_things = get_values() # میتواند مقدار داشته باشد یا نداشته باشد
first = list_of_things?[0]
برای توضیحات بیشتر در این مورد به PEP532 در سایت پایتون مراجعه کنید.
تولیدگر متغیرهای حساس به متن
پروپوزال شماره 567 موجود در بخش پایتون 3.7 متغیرهای متنی را معرفی میکند که مانند متغیرهای معمولی است و بهخوبی در محیطهای نخمانند (Thread-Like) کار میکند؛ محیطهایی مانند Asyncio در پایتون. تحقیق 568 نوشتهشده توسط ناتانیل اسمیت، بر اساس تحقیق 567 است، با این تفاوت که تولیدگر متغیر حساس به متن نیز به آن اضافهشده و برای کسانی است که از محیط asyncio استفاده میکنند، اطلاعاتی دارد.
توسعه APIهایی برای متدهای C:
پایتون دارای کلاسهای @staticmethod و @classmethod است، این کلاس متدها معمولا در خود پایتون تعریف میشوند، ولی میتوان آنها را در زبان C نیز تعریف کرد.
• PyType_GetModule
• PyType_DefiningTypeFromSlotFunc
• PyType_GetModuleState
• PyErr_PrepareImmutableException
شکل 1. تعدادی از پروپوزالهای ارائهشده برای پایتون 3.8 (PEPs)
انتساب عبارتها (Assignment Expressions)
این موضوع بحثبرانگیزترین پیشنهاد در پایتون 3.8 بوده و استفاده از آن نیز تاییدشده است. پروپوزال شماره 572 تغییر در دستور زبان پایتون را جهت فعال کردن انتساب عبارتها پیشنهاد میدهد. درک این تغییر در پایتون نیازمند درک تفاوت بین جمله (Statement) و عبارت (Expression) است. پایتون انواع مختلفی از جملات ساده دارد که هر کدام در یک خط نوشته میشوند، مگر زمانیکه با نقطه ویرگول (سمیکالن) آنها را از هم جدا کنید. مانند: import pdb; pdb.set_trace()
• جملات واکنشی: import foo
• جملات کنترلی: break
• جملات محاسباتی: x = y , x += y
همچنین پایتون عبارتهایی دارد که در نوع خاصی از جملات مانند زیر یافت میشوند:
• اگر جمله ترکیب if TEST: SUITE را داشته باشد و بهجای SUITE عبارتهای تودرتو باشد و از کلماتی مانند and، or، not بین آنها استفادهشده باشد.
• جملاتی که ترکیب for EXPRESSION LIST in TESTS: SUITE را داشته باشد.
• جملاتی برای حذف کردن یک عبارت del EXPRESSSION
• جملاتی که از (with as) استفاده میکنند
with TEST as EXPRESSION: SUITE
• جملاتی برای استفاده از فهرستها و دیکشنریها.
چیزی که نمیتوانید انجام دهید این است که جملات را در عبارتها قرار دهید، زیرا جملات هیچچیز را بازنمیگردانند. بنابراین جمله if x = y: اشتباه است و کار نمیکند.
>>> x = 1
>>> y = 2
>>> if x=y:
File “<stdin>”, line 1
if x=y:
^
SyntaxError: invalid syntax
PEP572 پیشنهاد میدهد که از عملگر جدید := برای این نوع عبارتهای مقداردهی استفاده شود. به این مثال توجه کنید که شما یک فهرست از محصولات دارید و میخواهید هزینه حملونقل را محاسبه کنید. اگر شما از IF در این فهرست استفاده کنید، نمیتوانید از ارزش مقادیر فهرست برای مقداردهی استفاده کنید. ولی با ترکیب جدید میتوانید یک نام جدید مانند cost تعریف کنید و مقادیر فهرست را در آن بریزید. (شکل 3)
شکل 3. مثالی درباره پروپوزال 572
تغییرات در کلاسهای موجود در توابع داخلی
PEP576 پیشنهادی برای تغییراتی در توابع داخلی پایتون ارائه میدهد. این یعنی چه و چرا نیاز است؟ اگر درحالتوسعه یک ماژول پایتون، مانند سایتون (Cython) باشید و بخواهید توابع را با C پیادهسازی کنید، دو انتخاب دارید:
• استفاده از توابع داخلی پایتون (به زبان C) مانند len, print و ... که ترجیح داده میشود، اما مشکل در مورد دادههایی است که میتوانید در ماژول به آنها دسترسی داشته باشید. (که هنگام اجرای آن در پایتون به آنها دسترسی ندارید.)
• خودتان توابع len, print و ... را بسازید که این کار دشوار و زمانبر است.
بر اساس این موضوع، دو پیشنهاد برای تغییراتی در APIهای زبان C ارائه میشود:
1. تابعی مانند PyBuiltinFunction_New(PyMethodDef *ml, PyObject *module) اضافه شود تا بتوان با آن توابع داخلی ایجاد کرد. چنین کاری میتواند ارتباط بین C و پایتون را برقرار کند تا مشکلات گفتهشده در بالا را نداشته باشد.
2. در صورت توقف توابع C در پایتون (PyCFunction_NewEx() PyCFunction_New()) مقدار یک تابع داخلی (PyBuiltinFunction) بازگردانده شود.
پروپوزال شماره 573 در این رابطه پیشنهاد توسعه APIهایی را میدهد که بدون فراخوانی تابع هزینهبر PyState_FindModule بتوان از وضعیت ماژول نوشتهشده آگاه شد. این کار برای Cython بسیار مفید است.
هیچکدام از کلاسهای گفتهشده نمیتوانند بهصورت زیرکلاس تعریف شوند، بنابراین هرگونه بهینهسازی برای متدها یا توابع داخلی عملا قابلپیادهسازی نیست؛ زیرا زمانیکه از دستوراتی با مشکلات گفتهشده در بالا استفاده میکنید، کلاسهای جدید شما نیز همان مشکلات را به ارث خواهند برد. به همین دلیل، در پروپوزال 573 پیشنهادشده کار چک کردن توابع (builtin_function_or_method) و (method_descriptor) با یک پروتکل «C Call» جدید جایگزین شود. استفاده از این پروتکل جدید به این معنا است که انواع توسعههای انجامشده توسط کاربران همان مزایای توابع داخلی را خواهند داشت. بهعنوانمثال کد LOAD_METHOD با 20 درصد سرعت بیشتر در پایتون 3.7 کار خواهد کرد.
بررسی hookها در زمان اجرا
پروپوزال 578 پیشنهاد اضافه کردن Hook (قلاب) به سایتون را میدهد که میتواند بسیار مفید باشد. برای استفاده از Hook در سطح کرنل و یوزر باید APIهای لازم به ماژول sys اضافه شود و این قابلیت را خواهد داشت که Hook را در هر دو سطح فراخوانی کند. نکتهای که باید ذکر شود این است که Hook اضافهشده دیگر قابلیت حذف یا جایگزینی را نخواهد داشت.
# Add an auditing hook
sys.addaudithook(hook: Callable[[str, tuple]])
# Raise an event with all auditing hooks
sys.audit(str, *args)
رویدادهای پیشنهادی برای ایجاد قلاب شامل Exec, Import و Compile And Object میشود که قلابهای سطح پایین بهشمار میآیند، اما برای قلابهای سطح بالا نیز مانند باز کردن سوکتهای شبکه یا یک URL استفاده میشود. این کار میتواند به ایجاد یکسری پلاگینهای جانبی برای سایتون منجر شود که بتوان با آن محیط اجرا را کنترل یا حتی قفل کرد، دقیقا مانند SELinux در هسته لینوکس. قلابها واکنش به رویدادها را پیادهسازی میکنند؛ واکنشهایی مانند لاگ کردن یک رویداد، قطع انجام یک عملیات یا بستن یک پروسه در حال انجام با یک فرمان خروج از سیستم.
نتیجهگیری
بر اساس گفتههای بالا، در پایتون 3.8 سعی شده بسیاری از ایرادهای نسخه قبلی برطرف شود، بهخصوص در بخش ماژولهای C. اگرچه این ایرادها کوچک به نظر میآیند، اما میتوانند برای برنامهنویسان دردسرهای زیادی ایجاد کنند. با اضافهکردن کلاسها و متدهای داخلی به پایتون دیگر نیاز نیست برنامهنویس کار دشوار و زمانبر اسکریپتنویسی را بهصورت شخصی انجام دهد که این امر به غیر از سرعت بخشیدن به کار، باعث ایجاد دستور زبان واحد برای همه برنامهنویسان میشود.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
برچسب:
به اشتراک گذاری مطلب:
نظر شما چیست؟