إصدار لغة برمجة Python 3.9

بعد عام من التطوير المقدمة إصدار هام للغة البرمجة بيثون 3.9. كان Python 3.9 هو الإصدار الأول بعد ذلك перехода مشروع على دورة جديدة إعداد ودعم الإصدارات. سيتم الآن إنشاء الإصدارات الرئيسية الجديدة مرة واحدة سنويًا، وسيتم إصدار التحديثات التصحيحية كل شهرين. سيتم دعم كل فرع مهم لمدة سنة ونصف، وبعد ذلك سيتم تطويره لمدة ثلاث سنوات ونصف أخرى لإصلاح نقاط الضعف.

يبدأ العمل على فرع جديد الآن قبل خمسة أشهر من إصدار الفرع التالي، أي. بالتزامن مع إصدار بايثون 3.9 بدأت اختبار ألفا لفرع بايثون 3.10. سيكون فرع Python 3.10 في إصدار ألفا لمدة سبعة أشهر، سيتم خلالها إضافة ميزات جديدة وإصلاح الأخطاء. بعد ذلك، سيتم اختبار الإصدارات التجريبية لمدة ثلاثة أشهر، سيتم خلالها حظر إضافة ميزات جديدة وسيتم إيلاء كل الاهتمام لإصلاح الأخطاء. في الشهرين الأخيرين قبل الإصدار، سيكون الفرع في مرحلة الإصدار المرشح، حيث سيتم إجراء التثبيت النهائي.

بين وأضاف الابتكارات في بايثون 3.9:

  • في القواميس المحددة باستخدام فئة dict المضمنة، ظهر دعم عوامل الدمج "|" و"|=" التحديثات، التي تكمل الطرق {**d1, **d2} وdict.update المقترحة سابقًا لدمج القواميس.

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}

    >>> س | ذ
    {'key1': 'القيمة1 من x'، 'key2': 'القيمة2 من y'، 'key3': 'القيمة3 من y'}

    >>> ذ | س
    {'key2': 'القيمة2 من x'، 'key3': 'القيمة3 من y'، 'key1': 'القيمة1 من x'}

  • تتضمن مجموعة الأنواع المضمنة القائمة والإملاء والصفوف، والتي يمكن استخدامها كأنواع أساسية دون الاستيراد من وحدة الكتابة. أولئك. بدلاً من كتابة.List، وtyping.Dict، وtyping.Tuple، يمكنك الآن التحديد
    فقط قم بإدراج وإملاء وtuple:

    def Greeting_all(names: list[str]) -> لا شيء:
    للاسم في الأسماء:
    طباعة ("مرحبا"، الاسم)

  • تم تقديمة أدوات مرنة لشرح الوظائف والمتغيرات. لإرفاق التعليقات التوضيحية، تمت إضافة نوع مشروح جديد إلى وحدة الكتابة، مما يؤدي إلى توسيع الأنواع الموجودة ببيانات تعريف إضافية يمكن استخدامها للتحليل الثابت أو لتحسينات وقت التشغيل. للوصول إلى البيانات التعريفية من التعليمات البرمجية، تمت إضافة المعلمة include_extras إلى طريقة Typing.get_type_hints().

    charType = Annotated[int, ctype("char")] UnsignedShort = Annotated[int, struct2.ctype('H')]

  • منغم إلى أسفل المتطلبات النحوية لمصممي الديكور - يمكن الآن استخدام أي تعبير مناسب للاستخدام في كتل if وwhile كمصمم ديكور. أدى هذا التغيير إلى تحسين إمكانية قراءة كود PyQt5 بشكل كبير وتبسيط عملية صيانة هذه الوحدة:

    كان:
    Button_0 = أزرار[0] @button_0.clicked.connect

    الآن يمكنك الكتابة:
    @buttons[0].clicked.connect

  • إلى المكتبة القياسية مضاف وحدة معلومات المنطقة، والذي يتضمن معلومات من قاعدة بيانات المنطقة الزمنية IANA.

    >>> من Zoneinfo قم باستيراد ZoneInfo
    >>> من تاريخ الاستيراد، timedelta
    >>> #التوقيت الصيفي
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> طباعة (دت)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'التوقيت الصيفى الباسيفيكى'

    >>> # التوقيت القياسي
    >>> dt += timedelta(days=7)
    >>> طباعة (دت)
    2020-11-07 12:00:00-08:00

    >>> طباعة (dt.tzname())
    PST

  • تمت إضافة وحدة graphlib، والتي مُنفّذ دعم الفرز الطوبولوجي للرسوم البيانية.
  • مقترح طرق جديدة لإزالة البادئات ونهايات الأسطر - str.removeprefix(prefix) وstr.removesuffix(suffix). تمت إضافة الأساليب إلى كائنات str وbytes وbytearray وcollections.UserString.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'حاجِز'

  • متضمن محلل جديد PEG (تحليل قواعد التعبير) الذي حل محل المحلل اللغوي ليرة لبنانية(1). أتاح استخدام المحلل اللغوي الجديد التخلص من بعض "الاختراقات" المستخدمة لتجاوز القيود في LL(1)، وخفض تكاليف العمالة بشكل كبير لصيانة المحلل اللغوي. من حيث الأداء، فإن المحلل اللغوي الجديد هو تقريبًا على نفس المستوى السابق، ولكنه يتقدم عليه بشكل كبير من حيث المرونة، مما يسمح لك بالشعور بمزيد من الحرية عند تصميم ميزات لغة جديدة. يتم الاحتفاظ بكود المحلل اللغوي القديم في الوقت الحالي ويمكن إرجاعه باستخدام علامة "-X oldparser" أو متغير البيئة "PYTHONOLDPARSER=1"، ولكن ستتم إزالته في الإصدار 3.10.
  • قدمت قدرة طرق امتداد C على الوصول إلى حالة الوحدات النمطية التي تم تعريفها فيها باستخدام عدم مرجعية المؤشر المباشر بدلاً من البحث عن حالة الوحدة النمطية باستخدام وظيفة PyState_FindModule. يتيح لك هذا التغيير زيادة أداء وحدات C عن طريق تقليل الحمل الزائد للتحقق من حالة الوحدة النمطية أو التخلص منه تمامًا. لربط وحدة نمطية بفئة ما، يتم اقتراح الدالة C PyType_FromModuleAndSpec()، وللحصول على الوحدة النمطية وحالتها، يتم اقتراح الدالة C PyType_GetModule() وPyType_GetModuleState()، ولتوفير طريقة يمكنها الوصول إلى الفئة حيث يتم تعريفها، يتم اقتراح الدالة C-PyCMethod وعلامة METH_METHOD.
  • جامع القمامة تم التوصيل من تأمين المجموعات التي تحتوي على كائنات تم إعادة تنشيطها والتي تظل قابلة للوصول خارجيًا بعد تشغيل أداة الإنهاء.
  • الطريقة المضافة os.pidfd_open، والذي يسمح باستخدام نظام Linux kernel الفرعي "pidfd" للتعامل مع حالة إعادة استخدام PID (يرتبط pidfd بعملية معينة ولا يتغير، بينما يمكن ربط PID بعملية أخرى بعد انتهاء العملية الحالية المرتبطة بمعرف PID هذا ).
  • تم تحديث دعم مواصفات Unicode إلى الإصدار 13.0.0.
  • مستبعد تسريب ذاكرة عند إعادة تهيئة مترجم بايثون في نفس العملية.
  • تم تحسين أداء نطاق الأنواع المضمنة، Tuple، Set، Frozenset، List، dict. مُنفّذ من خلال استخدام بروتوكول الاختصار Vectorcall للوصول بشكل أسرع إلى الكائنات المكتوبة بلغة C.
  • يتم تحميل الوحدات _abc، وaudiop، و_bz2، و_codecs، و_contextvars، و_crypt، و_functools، و_json، و_locale، والمشغل، والموارد، والوقت، و_weakref من التهيئة على عدة مراحل.
  • تم تحويل وحدات المكتبة القياسية audioop وast وgrp و_hashlib وpwd و_posixsubprocess وrandom وselect وstruct وtermios وzlib إلى استخدام مقيد أبي مستقر، الذي يحل مشكلة تشغيل مجموعات وحدات الامتداد لإصدارات مختلفة من Python (عند تحديث الإصدار، ليست هناك حاجة لإعادة بناء وحدات الامتداد، وستكون الوحدات المترجمة للإصدار 3.9 قادرة على العمل في الفرع 3.10).
  • لقد أوقفت وحدة asyncio دعم المعلمة reuse_address بسبب مشكلات أمنية محتملة (يسمح استخدام SO_REUSEADDR لـ UDP على Linux لعمليات مختلفة بإرفاق مآخذ توصيل الاستماع بمنفذ UDP).
  • تمت إضافة تحسينات جديدة، على سبيل المثال، تحسين أداء معالجات الإشارة في التطبيقات متعددة الخيوط، وزيادة سرعة وحدة المعالجة الفرعية في بيئة FreeBSD، وتعيين متغيرات مؤقتة بشكل أسرع (تعيين متغير في التعبير "لـ y في [expr" ]" أصبح الآن بنفس أداء التعبير "y = expr" "). بشكل عام، معظم الاختبارات عرض انخفاض الأداء مقارنة بالفرع 3.8 (يتم ملاحظة التسريع فقط في اختبارات write_local وwrite_deque):

    إصدار بايثون 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    الوصول للقراءة المتغير والسمة:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    الوصول إلى الكتابة المتغيرة والسمة:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    write_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    الوصول إلى بنية البيانات للقراءة:
    قائمة القراءة 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    read_dict 24.3 25.7 22.3 23.0 21.0 22.5
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    الوصول إلى بنية البيانات للكتابة:
    قائمة_الكتابة 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    write_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    عمليات المكدس (أو قائمة الانتظار):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    حلقة التوقيت:
    حلقة_فوقية 0.5 0.6 0.4 0.3 0.3 0.3

  • تم الحذف العديد من وظائف وأساليب Python 2.7 التي تم إهمالها سابقًا وأدت إلى تحذير الإيقاف في الإصدار السابق، بما في ذلك طريقة unescape() في html.parser.HTMLParser،
    tostring() و fromstring() في array.array، isAlive() في threading.Thread، getchildren() و getiterator() في ElementTree، sys.getcheckinterval()، sys.setcheckinterval()، asyncio.Task.current_task()، asyncio.Task.all_tasks() وbase64.encodestring() وbase64.decodestring().

المصدر: opennet.ru

إضافة تعليق