"هذا هو الإصدار الأول من 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
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 والمعالجات المتعددة في هذا الإصدار.
على سبيل المثال،
- لم تعد معلمة reuse_address asyncio.loop.create_datagram_endpoint () مدعومة بسبب مشكلات أمنية كبيرة.
- تمت إضافة 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 الرسمي .
إلغاء الاشتراك في التعليقات إذا فاتك شيء.