إصدار مستقر من Python 3.9.0

من المتوقع أن يتم إصدار النسخة المستقرة من Python 3.9.0 اليوم ، 10/05/2020. سيتلقى الإصدار الجديد تحديثات التصحيح كل شهرين تقريبًا لمدة 18 شهرًا تقريبًا. بعد مرور بعض الوقت على إصدار الإصدار النهائي 3.10.0 ، سيتم إصدار التحديث التاسع والأخير مع إصلاحات الأخطاء 3.9.



"هذا هو الإصدار الأول من Python الذي يتم تعيينه افتراضيًا لمثبت 64 بت على Windows. لا يسمح المثبت الآن بشكل نشط بالتثبيت على Windows 7. "

هذا هو الإصدار الأول من Python الذي يستخدم مثبت 64 بت على Windows افتراضيًا. يمنع المثبت الآن التثبيت على Windows 7. "



لقد قرأت ملاحظات إصدار Python 3.9 والمناقشات ذات الصلة. بناءً على المعلومات ، أردت كتابة دليل شامل حتى يتمكن الجميع من الحصول على فكرة عن الوظائف جنبًا إلى جنب مع عملهم التفصيلي.



UPD :

الانتقال إلى دورات الإصدار السنوية المستقرة ، راجع PEP 602

أليك كالينين

"كل إصدار جديد من Python سيصدر الآن في أكتوبر. سيتم إصدار Python 3.10 في أكتوبر 2021 ، و Python 3.11 في أكتوبر 2022. سيتم إصدار Buckfix كل شهرين. هذه أخبار رائعة بالنسبة لي ، يمكننا الآن التخطيط بوضوح لترقية بيئة بيثون ".



584



يقترح PEP هذا إضافة عوامل الدمج ( | ) والتحديث ( | = ) إلى فئة dt المدمجة.



للدمج: |



>>> a = {'milk': 'prostokvashino', 'heese': 'cheddar'} 
>>> b = {'milk': 1, 'heese': 2, 'bread': 3} 
>> >  | b 
{'milk': 1, 'heese': 2, 'bread': 3}
>>> b | a 
{'milk': 'prostokvashino', 'heese': 'cheddar', 'bread': 3}


للتحديث: | =



>>> a | = b 
>>> a 
{'milk': 1, 'heese': 2, 'bread': 3}


القاعدة الأساسية التي يجب تذكرها هي أنه في حالة وجود أي تعارضات رئيسية ، فسيتم الاحتفاظ بالقيمة الموجودة في أقصى اليمين.



بالطبع ، سيكون لدى العديد من البايثونيين سؤال ، لماذا هذا ضروري ، إذا كان هناك بالفعل خيار مألوف لدى الجميع



{**d1, **d2}


تمت الإجابة على هذا السؤال في PEP نفسه:



يبدو تفريغ القواميس قبيحًا وليس من السهل اكتشافه. قليلون سيكونون قادرين على تخمين ما يعنيه هذا عند رؤيته لأول مرة.


كما قال جيدو :

أعتذر عن PEP 448 ، ولكن حتى لو كنت تعرف ** د في سياق أبسط ، إذا سألت مستخدم Python النموذجي عن كيفية دمج اثنين من dt في واحد جديد ، فأنا أشك في أن الكثير من الناس سيفكرون في {** d1، ** d2}. أعلم أنني نسيت ذلك بنفسي عندما بدأ هذا الموضوع!


أيضًا {** d1، ** d2} لا تعمل مع الفئات الفرعية لـ dt مثل defaultdict




585



Generics اكتب تلميحات في المجموعات القياسية.



عام هو نوع يمكن تحديد معلماته ، نوع من الحاوية. يُعرف أيضًا باسم نوع حدودي أو نوع عام.



يتضمن هذا الإصدار دعمًا عالميًا لبناء الجملة لجميع المجموعات القياسية المتوفرة حاليًا في وحدة الكتابة. يمكننا استخدام قائمة أو ديكت أنواع على النحو الأنواع العامة بدلا من استخدام typing.List أو typing.Dict .



كانت:



from typing import List

a: List[str] = list()

def read_files(files: List[str]) -> None:
    pass


أصبح:



a: list[str] = list()

def read_files(files: list[str]) -> None:
    pass


قائمة كاملة بالأنواع
tuple

list

dict

set

frozenset

type

collections.deque

collections.defaultdict

collections.OrderedDict

collections.Counter

collections.ChainMap

collections.abc.Awaitable

collections.abc.Coroutine

collections.abc.AsyncIterable

collections.abc.AsyncIterator

collections.abc.AsyncGenerator

collections.abc.Iterable

collections.abc.Iterator

collections.abc.Generator

collections.abc.Reversible

collections.abc.Container

collections.abc.Collection

collections.abc.Callable

collections.abc.Set # typing.AbstractSet

collections.abc.MutableSet

collections.abc.Mapping

collections.abc.MutableMapping

collections.abc.Sequence

collections.abc.MutableSequence

collections.abc.ByteString

collections.abc.MappingView

collections.abc.KeysView

collections.abc.ItemsView

collections.abc.ValuesView

contextlib.AbstractContextManager # typing.ContextManager

contextlib.AbstractAsyncContextManager # typing.AsyncContextManager

re.Pattern # typing.Pattern, typing.re.Pattern

re.Match # typing.Match, typing.re.Match



بيب 615



دعم قاعدة بيانات المنطقة الزمنية لـ IANA في المكتبة القياسية.



غالبًا ما يشار إلى المناطق الزمنية لـ IANA باسم tz أو معلومات المنطقة. يوجد عدد كبير من المناطق الزمنية لـ IANA بمسارات بحث مختلفة لتحديد المنطقة الزمنية لـ IANA لكائن التاريخ والوقت. على سبيل المثال ، يمكننا تمرير اسم مسار البحث على أنه القارة / المدينة إلى كائن تاريخ / وقت لتعيين tzinfo الخاص به.



dt: datetime = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))


إذا مررنا المفتاح الخطأ ، فسيتم طرح استثناء

zoneinfo.ZoneInfoNotFoundError

بيب 616



وظائف سلسلة جديدة لإزالة البادئة واللاحقة. تمت إضافة وظيفتين جديدتين



إلى كائن str .



  • الوظيفة الأولى تزيل البادئة.
    str.removeprefix(prefix)
  • الوظيفة الثانية تزيل اللاحقة.
    str.removesuffix(suffix)


>>> 'hello_world'.removeprefix ('hello_') 
world
>>> 'hello_world'.removesuffix ('_world') 
hello


بيب 617



يقترح Python 3.9 استبدال محلل Python الحالي المستند إلى LL (1) بمحلل PEG جديد قائم على PEG يتميز بأداء عالٍ ومستقر.



محلل CPython الحالي يعتمد على LL (1). بعد ذلك ، تستند القواعد إلى LL (1) ، مما يسمح بتحليلها باستخدام محلل LL (1). محلل LL (1) يعمل من أعلى إلى أسفل. بالإضافة إلى ذلك ، يوزع بيانات الإدخال من اليسار إلى اليمين. القواعد الحالية عبارة عن قواعد نحوية خالية من السياق ، لذلك لا يتم أخذ سياق الرموز المميزة في الاعتبار.

يقترح Python 3.9 استبداله بمحلل PEG جديد قائم على PEG ، مما يعني أنه سيزيل القيود الحالية لقواعد Python LL (1). بالإضافة إلى ذلك ، تم إجراء إصلاحات على المحلل اللغوي الحالي ، بإضافة عدد من الاختراقات التي ستتم إزالتها. نتيجة لذلك ، سيؤدي ذلك إلى تقليل تكلفة الصيانة على المدى الطويل.



على سبيل المثال ، في حين أن أجهزة تحليل اللغة (1) والقواعد اللغوية سهلة التنفيذ ، إلا أن القيود تمنعهم من التعبير عن التركيبات المشتركة بطريقة طبيعية لمصمم اللغة والقارئ. ينظر المحلل اللغوي إلى رمز واحد فقط إلى الأمام للتمييز بين الاحتمالات.



الإصدار 30966



القدرة على إلغاء العقود الآجلة في وقت واحد . تمت إضافة



المعامل الجديد cancell_futures إلى concurrent.futures.Executor.shutdown () .



تحتوي هذه المعلمة على كافة العقود الآجلة المعلقة التي لم تبدأ بعد. قبل الإصدار 3.9 ، انتظرت العملية حتى تكتمل قبل الخروج من المنفذ. تمت إضافة



معلمة جديدة cancell_futures إلى ThreadPoolExecutor و ProcessPoolExecutor . يعمل عندما تكون قيمة المعلمة صحيحة ، ثم يتم إلغاء جميع العقود الآجلة المعلقة عند استدعاء وظيفة إيقاف التشغيل () .



عند الاغلاق ()يقوم المترجم بالتحقق مما إذا كان المنفذ قد تم جمع القمامة. إذا كان لا يزال في الذاكرة ، فإنه يحصل على جميع العناصر المعلقة ثم يلغي العقود الآجلة.



الإصدار 30966



تم إجراء عدد من التحسينات على مكتبة asyncio والمعالجات المتعددة في هذا الإصدار.



على سبيل المثال،



  1. لم تعد معلمة reuse_address asyncio.loop.create_datagram_endpoint () مدعومة بسبب مشكلات أمنية كبيرة.
  2. تمت إضافة coroutines الجديدة ، و shutdown_default_executor () ، و asyncio.to_thread () coroutines . يتم استخدام استدعاء جديد إلى asyncio.to_thread () لتشغيل الوظائف ذات الصلة بالإدخال / الإخراج على مؤشر ترابط منفصل لتجنب حظر حلقة الحدث.


أما بالنسبة للتحسينات التي تم إدخالها على مكتبة المعالجات المتعددة ، فقد تمت إضافة طريقة close () جديدة إلى فئة المعالجة المتعددة . تقوم هذه الطريقة بإغلاق قائمة الانتظار بشكل صريح. هذا يضمن أن قائمة الانتظار مغلقة ولا تبقى أطول من المتوقع. من المهم أن تتذكر أنه لا يمكن استدعاء أساليب get () و put () و blank () بعد إغلاق قائمة الانتظار.







الإصدار 37444



إصلاح الخلل مع استيراد الحزم.



كانت المشكلة الرئيسية في استيراد مكتبات Python قبل الإصدار 3.9 هي سلوك الاستيراد غير المتسق في Python عندما مرت الواردات النسبية من حزمة المستوى الأعلى.



المدمج .__ الاستيراد __ () رفع ValueError بينما قام importlib .__ برفع استيراد __ () خطأ استيراد.



الآن يتم تصحيحه . يقوم __Import __ () الآن برفع ImportError بدلاً من ValueError.



القضية 40286



توليد بايت عشوائي.



الميزة الأخرى التي تمت إضافتها في الإصدار 3.9 هي ميزة عشوائية .Random.randbytes () . يمكن استخدامه لتوليد بايت عشوائي.



يمكننا إنشاء أرقام عشوائية ، ولكن ماذا لو احتجنا إلى إنشاء وحدات بايت عشوائية؟ قبل الإصدار 3.9 ، كان على المطورين أن يكونوا مبدعين لإنشاء وحدات بايت عشوائية. على الرغم من أنه يمكننا استخدام os.getrandom () أو os.urandom () أو secrets.token_bytes () ، لا يمكننا إنشاء أنماط عشوائية زائفة.



على سبيل المثال ، لضمان إنشاء أرقام عشوائية بالسلوك المتوقع وإعادة إنتاج العملية ، نستخدم عادةً البذور مع الوحدة العشوائية العشوائية.



نتيجة لذلك ، تم تقديم طريقة random.Random.randbytes () . يولد بايت عشوائي.



الإصدار 28029



تصحيح وظيفة استبدال السلسلة.



مبدأ وظيفة الاستبدال هو أنه لكي تحل وسيطة قصوى معينة محل التكرار ، فإنها تستبدل مجموعة الأحرف من السلسلة بمجموعة الأحرف الجديدة.



لتوضيح المشكلة بشكل أكبر ، قبل الإصدار 3.9 ، كان لوظيفة الاستبدال سلوك غير متسق:



يتوقع المرء رؤية المدونة



"" .replace ("", "blog", 1) 
>>> '' 




يتوقع المرء أن يرى |



"" .replace ("", "|", 1) 
>>> '' 




"" .replace ("", "prefix") 
>>> 'prefix'




الإصدار 39648 ، الإصدار 39479 ، الإصدار 39288 ، الإصدار 39310



التغييرات في وحدة "الرياضيات".



إرجاع أصغر مضاعف مشترك لوسائط الأعداد الصحيحة:



>>> import  math 
>>> math.lcm(48,72,108) 
432




إرجاع القاسم المشترك الأكبر للوسيطات الصحيحة. النسخة السابقة تدعم فقط حجتين. دعم إضافي لعدد تعسفي من الحجج:



>>> import  math 
>>> math.gcd(9,12,21) 
3




تحسب رقم الفاصلة العائمة الأقرب إلى " س " في اتجاه " ص ".



>>> math.nextafter(2, -1)
1.9999999999999998




ترجع هذه الطريقة قيمة البت الأقل أهمية من رقم الفاصلة العائمة x.



>>> 1 - math.ulp(1)
0.9999999999999998
>>> math.nextafter(1, -1) + math.ulp(1)
1.0




الإصدار 38870



تمت إضافة طريقة unparse إلى وحدة ast.

يمكن استخدام الطريقة الجديدة لإنشاء سطر من التعليمات البرمجية ثم تنفيذه.



>>> import ast
>>> parsed = ast.parse('from sys import platform; print(platform)')
>>> unparsed_str = ast.unparse(parsed)
>>> print(unparsed_str)
from sys import platform
print(platform)
>>> exec(unparsed_str)
win32




الإصدار 39507 ، الإصدار 39509



إضافة رموز جديدة إلى http.HTTPStatus.



" وفر 418! "

418 IM_A_TEAPOT
103 EARLY_HINTS
425 TOO_EARLY




محدث :

بيب 614



تخفيف القيود النحوية للمزينين.



كانت:



buttons = [QPushButton(f'Button {i}') for i in range(10)]

button_0 = buttons[0]

@button_0.clicked.connect
def spam():
    ...

button_1 = buttons[1]

@button_1.clicked.connect
def eggs():
    ...


يمكنك الآن إزالة المهام غير الضرورية والاتصال مباشرة:



buttons = [QPushButton(f'Button {i}') for i in range(10)]

@buttons[0].clicked.connect
def spam():
    ...

@buttons[1].clicked.connect
def eggs():
    ...




"يجب وضع tuple بين قوسين."



هذا يعتمد على رؤية Guido في نفس الحرف. اقتبس:



لكنني لن أسمح بفواصل. لا أستطيع أن أتفق مع هذا



@f, g
def pooh(): ...


هذا يمكن أن يقود المبرمجين عديمي الخبرة إلى استنتاج مفاده أنه يمكن استدعاء العديد من المصممين على التوالي بهذه الطريقة. الأقواس ضرورية لتوضيح كل شيء بدون قيود إضافية أو بناء جملة معقد.




الإصدار 17005



توفر وحدة Graphlib الجديدة وظائف للفرز الطوبولوجي للرسم البياني للعقد المجزأة.

يمكن العثور على مزيد من التفاصيل في الوثائق .



محدث :ifinik

صورة



>>> from graphlib import TopologicalSorter 
>>> graph = {'E': {'C', 'F'}, 'D': {'B', 'C'}, 'B': {'A'}, 'A': {'F'}} 
>>> ts = TopologicalSorter(graph) 
>>> tuple(ts.static_order()) 
('C', 'F', 'E', 'A', 'B', 'D')
>>> tuple(ts.static_order())
('F', 'C', 'A', 'E', 'B', 'D')


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



الإصدار 37630 ، الإصدار 40479



تحديث مكتبة هاشليب.

يمكن لـ Hashlib الآن استخدام تجزئات SHA3 و SHAKE XOF من OpenSSL.

يمكن الآن تعطيل وحدات التجزئة المدمجة أو تمكينها بشكل انتقائي ، على سبيل المثال لفرض تطبيق يستند إلى OpenSSL.



الاقوي



ملخص لتحسينات الأداء من Python 3.4 إلى Python 3.9:



Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    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

Variable and attribute write access:
    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

Data structure read access:
    read_list                       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

Data structure write access:
    write_list                      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

Stack (or queue) operations:
    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

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3


يعرض البرنامج النصي للاختبار الوقت بالنانو ثانية. تم إجراء الاختبارات على معالج Intel Core i7-4960HQ . يمكن العثور على كود الاختبار في المستودع على " Tools / scripts / var_access_benchmark.py " .



شكرآ لك على أهتمامك.



رابط إلى دليل Python 3.9 الرسمي .

إلغاء الاشتراك في التعليقات إذا فاتك شيء.



All Articles