Python 3.10

صدر الإصدار Python 3.10.0 (النهائي) في 4 أكتوبر 2021. وقد عُرّفت ميزات الإصدار 3.10 في PEP 619 ويمكن العثور على وصف تفصيلي للتغييرات في ما الجديد في Python 3.10.

ميزات بناء الجملة الجديدة

الحالة

PEP 634

مطابقة الأنماط البنيوية: المواصفات

[1]

PEP 635

مطابقة الأنماط البنيوية: الدافع والأساس المنطقي

[1]

PEP 636

مطابقة الأنماط البنيوية: دليل تعليمي

[1]

bpo-12782

أصبح استخدام مديري السياق بين قوسين مسموحًا به رسميًا الآن

ميزات جديدة في المكتبة القياسية

PEP 618

إضافة فحص اختياري للطول إلى zip

تحسينات المفسّر

PEP 626

أرقام أسطر دقيقة لأدوات التصحيح والأدوات الأخرى

ميزات الأنواع (typing) الجديدة

PEP 604

السماح بكتابة أنواع الاتحاد بالصيغة X | Y

PEP 613

الأسماء المستعارة الصريحة للأنواع

PEP 612

متغيرات مواصفات المعاملات

حالات الإهمال أو الإزالة أو التقييد المهمة

PEP 644

اشتراط OpenSSL 1.1.1 أو أحدث

PEP 632

إهمال وحدة distutils.

غير ذي صلة

PEP 623

إهمال العضو wstr في PyUnicodeObject والتحضير لإزالته.

غير ذي صلة

PEP 624

إزالة واجهات برمجة تطبيقات مُرمّز Py_UNICODE

غير ذي صلة

PEP 597

إضافة EncodingWarning اختياري

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

أصبح للنوع int طريقة جديدة هي int.bit_count()، تعيد عدد الآحاد في التمثيل الثنائي لعدد صحيح معين، ويُعرف هذا أيضًا باسم تعداد السكان (population count).

أصبحت العروض التي تعيدها dict.keys() و dict.values() و dict.items() تمتلك جميعها الآن سمة mapping تعطي كائن types.MappingProxyType يغلّف القاموس الأصلي.

PEP 618: أصبح للدالة zip() الآن راية strict اختيارية، تُستخدم لاشتراط أن تكون جميع العناصر القابلة للتكرار متساوية الطول.

لم تعد الدوال المدمجة ودوال الامتدادات التي تأخذ وسائط أعدادًا صحيحة تقبل Decimals و Fractions والكائنات الأخرى التي لا يمكن تحويلها إلى أعداد صحيحة إلا مع فقدان (مثل تلك التي تمتلك الطريقة __int__() لكنها لا تمتلك الطريقة __index__()).

إذا أعادت object.__ipow__() القيمة NotImplemented، فسيعود العامل بشكل صحيح إلى object.__pow__() و object.__rpow__() كما هو متوقع.

يمكن الآن استخدام تعبيرات الإسناد دون أقواس داخل قيم المجموعات الحرفية واستيعابات المجموعات، وكذلك في فهارس التسلسلات (لكن ليس في الشرائح).

أصبح للدوال سمة جديدة __builtins__ تُستخدم للبحث عن الرموز المدمجة عند تنفيذ دالة، بدلًا من البحث في __globals__['__builtins__']. تُهيّأ السمة من __globals__["__builtins__"] إن وُجدت، وإلا فمن العناصر المدمجة الحالية.

أُضيفت دالتان مدمجتان جديدتان -- aiter() و anext() -- لتوفير نظيرين غير متزامنين لـ iter() و next() على التوالي.

أصبحت الطرق الساكنة (@staticmethod) وطرق الصنف (@classmethod) ترث الآن سمات الطريقة (__module__ و __name__ و __qualname__ و __doc__ و __annotations__) ولها سمة جديدة __wrapped__. علاوة على ذلك، أصبحت الطرق الساكنة قابلة للاستدعاء الآن كدوال عادية.

لم تعد التعليقات التوضيحية للأهداف المركبة (كل شيء بخلاف أهداف simple name المُعرّفة في PEP 526) تسبب أي تأثيرات في وقت التشغيل مع from __future__ import annotations.

أصبحت كائنات الأصناف والوحدات تنشئ الآن قواميس تعليقات توضيحية فارغة بشكل كسول عند الطلب. تُخزّن قواميس التعليقات التوضيحية في __dict__ الخاص بالكائن للتوافق مع الإصدارات السابقة. وهذا يحسّن أفضل الممارسات للعمل مع __annotations__.

أصبحت التعليقات التوضيحية المكوّنة من yield أو yield from أو await أو التعبيرات المُسمّاة محظورة الآن مع from __future__ import annotations بسبب آثارها الجانبية.

أصبح استخدام المتغيرات غير المرتبطة و super() والتعبيرات الأخرى التي قد تغيّر معالجة جدول الرموز كتعليقات توضيحية بلا تأثير الآن مع from __future__ import annotations.

أصبحت قيم تجزئة (hashes) قيم NaN لكل من النوع float والنوع decimal.Decimal تعتمد الآن على هوية الكائن. في السابق، كانت تتجزأ دائمًا إلى 0 رغم أن قيم NaN غير متساوية فيما بينها. وقد تسبب هذا في سلوك زمن تشغيل تربيعي محتمل بسبب التصادمات المفرطة في التجزئة عند إنشاء قواميس ومجموعات تحتوي على عدة قيم NaN.

سيُطلق استثناء SyntaxError (بدلًا من NameError) عند حذف الثابت __debug__.

أصبح لاستثناءات SyntaxError الآن سمتا end_lineno و end_offset. وستكونان None إذا لم تُحدَّدا.

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

asyncio

إضافة الطريقة المفقودة connect_accepted_socket().

array

أصبح للطريقة index() الخاصة بـ array.array الآن المعاملان الاختياريان start و stop.

gc

إضافة خطافات تدقيق (audit hooks) لـ gc.get_objects() و gc.get_referrers() و gc.get_referents().

hashlib

تتطلب وحدة hashlib الآن OpenSSL 1.1.1 أو أحدث.

تمتلك وحدة hashlib دعمًا أوليًا لـ OpenSSL 3.0.0.

أصبح البديل المكتوب بلغة Python بالكامل لـ pbkdf2_hmac() مُهمَلًا. في المستقبل، سيكون PBKDF2-HMAC متاحًا فقط عند بناء Python بدعم OpenSSL.

os

إضافة دعم os.cpu_count() لنظام التشغيل في الوقت الفعلي VxWorks RTOS.

إضافة دالة جديدة os.eventfd() ومساعدات ذات صلة لتغليف استدعاء النظام eventfd2 على Linux.

إضافة os.splice() التي تتيح نقل البيانات بين واصفي ملفات دون النسخ بين فضاء عناوين النواة وفضاء عناوين المستخدم، حيث يجب أن يشير أحد واصفي الملفات إلى أنبوب.

إضافة O_EVTONLY و O_FSYNC و O_SYMLINK و O_NOFOLLOW_ANY لنظام macOS.

platform

إضافة platform.freedesktop_os_release() لاسترجاع تعريف نظام التشغيل من الملف القياسي freedesktop.org os-release.

socket

أصبح الاستثناء socket.timeout الآن اسمًا مستعارًا لـ TimeoutError.

إضافة خيار لإنشاء مقابس MPTCP باستخدام IPPROTO_MPTCP.

إضافة الخيار IP_RECVTOS لاستقبال حقول نوع الخدمة (ToS) أو DSCP/ECN.

ssl

تتطلب وحدة ssl الآن OpenSSL 1.1.1 أو أحدث.

تمتلك وحدة ssl دعمًا أوليًا لـ OpenSSL 3.0.0 وخيارًا جديدًا OP_IGNORE_UNEXPECTED_EOF.

أصبحت الدالة المُهمَلة واستخدام الثوابت المُهمَلة ينتج عنهما الآن DeprecationWarning. تحتوي ssl.SSLContext.options على OP_NO_SSLv2 و OP_NO_SSLv3 مضبوطين افتراضيًا، ولذلك لا يمكنها التحذير من ضبط الراية مجددًا.

أصبحت وحدة ssl الآن تمتلك إعدادات افتراضية أكثر أمانًا. تُعطّل افتراضيًا الشيفرات التي تفتقر إلى السرية المستقبلية أو التي تستخدم MAC من نوع SHA-1. ويحظر مستوى الأمان 2 مفاتيح RSA و DH و ECC الضعيفة التي تقل عن 112 بت من الأمان. تتخذ SSLContext افتراضيًا الإصدار الأدنى من البروتوكول TLS 1.2. وتستند الإعدادات إلى أبحاث Hynek Schlawack.

لم تعد البروتوكولات المُهمَلة SSL 3.0 و TLS 1.0 و TLS 1.1 مدعومة رسميًا. ولا تحظرها Python بشكل فعّال. إلا أن خيارات بناء OpenSSL وإعدادات التوزيعات وتصحيحات المورّدين ومجموعات الشيفرات قد تمنع نجاح المصافحة (handshake).

إضافة معامل timeout إلى الدالة ssl.get_server_certificate().

تستخدم وحدة ssl أنواع الكومة (heap-types) والتهيئة متعددة المراحل.

أُضيفت راية تحقق جديدة VERIFY_X509_PARTIAL_CHAIN.

sys

إضافة السمة sys.orig_argv: قائمة وسائط سطر الأوامر الأصلية المُمرّرة إلى الملف التنفيذي لـ Python.

إضافة sys.stdlib_module_names، التي تحتوي على قائمة أسماء وحدات المكتبة القياسية.

_thread

أصبحت _thread.interrupt_main() الآن تأخذ رقم إشارة اختياريًا لمحاكاته (الافتراضي لا يزال signal.SIGINT).

ملاحظات