Python 3.9

صدرت النسخة Python 3.9.0 (النهائية) في 5 أكتوبر 2020. ميزات الإصدار 3.9 معرّفة في PEP 596 ويمكن العثور على وصف تفصيلي للتغييرات في ما الجديد في Python 3.9

الميزات

الحالة

PEP 573

وصول سريع إلى حالة الوحدة من طرق أنواع امتدادات C

غير ذي صلة

PEP 584

إضافة عوامل الاتحاد إلى dict

مكتمل [1]

PEP 585

تلميحات الأنواع العامة في المجموعات القياسية

PEP 593

توصيفات مرنة للدوال والمتغيرات

PEP 602

يتبنى CPython دورة إصدار سنوية. بدلًا من السنوية، نهدف إلى دورة إصدار كل شهرين

غير ذي صلة

PEP 614

تخفيف قيود القواعد النحوية على المُزخرِفات (decorators)

PEP 615

أصبحت قاعدة بيانات المناطق الزمنية IANA موجودة الآن في المكتبة القياسية ضمن وحدة zoneinfo

PEP 616

طرق سلاسل نصية لإزالة البادئات واللواحق

PEP 617

يستخدم CPython الآن مُحلِّلًا نحويًا جديدًا قائمًا على PEG

غير ذي صلة

تغييرات أخرى في اللغة:

تُطلق الآن __import__() الاستثناء ImportError بدلًا من ValueError

مكتمل

يحصل Python الآن على المسار المطلق لاسم ملف البرنامج النصي المحدد في سطر الأوامر (مثال: python3 script.py): أصبحت السمة __file__ للوحدة __main__ مسارًا مطلقًا، بدلًا من مسار نسبي

افتراضيًا، ولأفضل أداء، يُتحقق من الوسيط errors فقط عند أول خطأ في الترميز/فك الترميز، ويُتجاهل أحيانًا الوسيط encoding بالنسبة للسلاسل الفارغة

تُعيد الآن "".replace("", s, n) القيمة s بدلًا من سلسلة فارغة لجميع قيم n غير الصفرية. وأصبحت الآن متسقة مع "".replace("", s)

يمكن الآن استخدام أي تعبير صالح كمُزخرِف (decorator). كانت القواعد النحوية في السابق أكثر تقييدًا بكثير

أصبح التشغيل المتوازي لـ aclose() / asend() / athrow() محظورًا الآن، وتعكس ag_running الآن حالة التشغيل الفعلية للمولّد غير المتزامن

لم تعد الأخطاء غير المتوقعة في استدعاء الطريقة __iter__ تُحجب بواسطة TypeError في العامل in والدوال contains() وindexOf() وcountOf() الخاصة بوحدة operator

لم يعد بإمكان تعبيرات lambda غير المحاطة بأقواس أن تكون الجزء التعبيري في عبارة if ضمن الاستيعابات وتعبيرات المولّدات

تغييرات على الوحدات المدمجة:

asyncio

بسبب مخاوف أمنية كبيرة، لم يعد المعامل reuse_address الخاص بـ asyncio.loop.create_datagram_endpoint() مدعومًا

أُضيف كوروتين جديد shutdown_default_executor() يجدول إيقاف تشغيل المنفِّذ الافتراضي الذي ينتظر انتهاء ThreadPoolExecutor من الإغلاق. كما حُدّثت asyncio.run() لاستخدام الكوروتين الجديد.

أُضيفت asyncio.PidfdChildWatcher، وهي تنفيذ مراقب أبناء خاص بـ Linux يستطلع واصفات ملفات العمليات

أُضيف كوروتين جديد coroutine asyncio.to_thread()

عند إلغاء المهمة بسبب انتهاء المهلة، ستنتظر الآن asyncio.wait_for() حتى يكتمل الإلغاء، وذلك أيضًا في حالة كون المهلة <= 0، مثلما تفعل مع المهل الموجبة

تُطلق asyncio الآن TyperError عند استدعاء طرق غير متوافقة مع مقبس ssl.SSLSocket

gc

لا يتوقف جمع المهملات عند الكائنات المُعاد إحياؤها

أُضيفت دالة جديدة gc.is_finalized() للتحقق مما إذا كان الكائن قد جرى إنهاؤه بواسطة جامع المهملات

math

وُسّعت الدالة math.gcd() للتعامل مع وسطاء متعددة. كانت في السابق تدعم وسيطين فقط

أُضيفت math.lcm(): تُعيد المضاعف المشترك الأصغر للوسطاء المحددة

أُضيفت math.nextafter(): تُعيد قيمة الفاصلة العائمة التالية بعد x باتجاه y

أُضيفت math.ulp(): تُعيد قيمة أقل بت دلالة (least significant bit) لعدد ذي فاصلة عائمة

os

أُتيحت os.pidfd_open() وos.P_PIDFD الخاصتان بـ Linux

أصبحت الدالة os.unsetenv() متاحة الآن على Windows أيضًا

مكتمل

أصبحت الدالتان os.putenv() وos.unsetenv() متاحتين دائمًا الآن

مكتمل

أُضيفت دالة os.waitstatus_to_exitcode(): تحوّل حالة الانتظار إلى رمز خروج

random

أُضيفت طريقة جديدة random.Random.randbytes: تولّد بايتات عشوائية

sys

أُضيفت سمة جديدة sys.platlibdir: اسم دليل المكتبة الخاص بالمنصة

في السابق، كانت sys.stderr مخزّنة على شكل كتل (block-buffered) في الوضع غير التفاعلي. أما الآن فإن stderr تتخذ افتراضيًا التخزين السطري الدائم (line-buffered)

ملاحظات