ما هو الجديد المتوقع في بايثون 3.9

الإصدار الجديد متوقع فقط في أكتوبر ، ولكن يمكنك بالفعل قراءة ما ينتظرنا فيه واختبار الإصدار الأولي.
في هذه المقالة ، التغييرات الأكثر إثارة للاهتمام ، في رأيي.

أولاً ، يتم تذكيرنا بأن الطبقات التي تدعم التوافق العكسي مع الإصدار 2.7 تتم إزالتها ببطء ويطلب منها الانتباه إلى DeprecationWarning وإزالتها. ستبقى بعض التحذيرات عند 3.9 ، ولكن من الأفضل التخلص منها.

عامل
دمج القاموس ( PEP-584 ) حتى الآن ، كانت هناك عدة طرق لدمج القواميس ، ولكن لكل منها عيوب أو فروق دقيقة طفيفة.
عدة طرق لدمج القواميس
1. update
d1 = {'one': 1}
d2 = {'two': 2}
#     ,..
d1.update(d2)
# ...  . 
united_dict = d1.copy()
united_dict.update(d2)

2.
united_dict = {**d1, **d2}

, , , .
3. dict(d1, **d2), . , d2 .
4. collections.ChainMap
.
, , .
from collections import ChainMap
d1 = {'one': 1}
d2 = {'two': 2}
united_dict = ChainMap(d1, d2)

, , , . , - .

الآن يمكنك الكتابة ببساطة
united_dict = d1 | d2
# ,        ,    update():
d1 |= d2

وبالتالي ، فإن إمكانية جديدة لدمج القواميس مع عامل واحد ، على ما أعتقد ، سوف تجذب الكثير.

تبسيط التعليقات التوضيحية للحاويات والأنواع الأخرى التي يمكن تحديد معلماتها ( PEP-0585 )
الابتكار التالي مفيد جدًا لأولئك الذين يستخدمون التعليقات التوضيحية من النوع.
يبسط الآن التعليق التوضيحي للمجموعات ، مثل القائمة والإملاء ، والأنواع ذات المعلمات بشكل عام.

بالنسبة لهذه الأنواع ، يتم تقديم مصطلح عام - هذا النوع يمكن تحديده ، وعادة ما يكون حاوية. على سبيل المثال ، املاء. والسؤال هو كيفية ترجمتها بشكل صحيح بحيث لا يكسر الأسنان. لا أريد حقًا استخدام كلمة "عام". لذا في التعليقات ، أتطلع حقًا إلى اقتراحات أخرى. ربما في مكان ما في الترجمات كان هناك اسم أفضل؟
معلمات عامة: dict [str، int].

لذلك بالنسبة لهذه الأنواع ، لا تحتاج الآن إلى استيراد التعليقات التوضيحية المقابلة من الكتابة ، ولكن يمكنك فقط استخدام أسماء الأنواع.
على سبيل المثال
# 
from typing import List
List[str]
# 
list[int]

.

:
# 
from typing import OrderedDict
OrderedDict[str, int]
# 
from collections import OrderedDict
OrderedDict[str, int]

tuple # typing.Tuple
list # typing.List
dict # typing.Dict
set # typing.Set
frozenset # typing.FrozenSet
type # typing.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


بالنسبة للسلاسل ، ظهرت طرق removeprefix () و removesuffix () ( PEP 616 )
. كل شيء بسيط هنا. إذا بدأ السطر ببادئة ، فسيتم إرجاع الخط بدون هذه البادئة. إذا تم تكرار البادئة عدة مرات ، فسيتم حذفها مرة واحدة فقط. بالمثل مع اللاحقة:
some_str = 'prefix of some string and here suffix'
some_str.removeprefix('prefix')
>> ' of some string and here suffix'
some_str.removesuffix('suffix')
>> 'prefix of some string and here '

البدائل الحالية
1. , , — removeprefix.
def removeprefix(self: str, prefix: str, /) -> str:
    if self.startswith(prefix):
        return self[len(prefix):]
    else:
        return self[:]

2. lstrip, rstrip:
	'foobar'.lstrip(('foo',))

, , .

بعض التغييرات على وحدة الرياضيات
تقوم دالة math.gcd () للعثور على أكبر القاسم المشترك الآن بقبول قائمة الأعداد الصحيحة ، بحيث يمكنك العثور على القاسم المشترك الذي يحتوي على أكثر من رقم واحد مع وظيفة واحدة.
هناك وظيفة لتحديد أصغر مضاعف مشترك لـ math.lcm () ، والذي يقبل أيضًا عددًا غير محدود من الأعداد الصحيحة.
الوظيفتان التاليتان مترابطتان.
math.nextafter (x، y) - يحسب رقم الفاصلة العائمة الأقرب إلى x إذا كان يتحرك في اتجاه y.
الرياضيات. ulp (x)- تعني "الوحدة في المكان الأخير" وتعتمد على دقة حسابات جهاز الكمبيوتر الخاص بك. بالنسبة للأرقام الموجبة ، سيتم إرجاع أدنى قيمة للرقم ، بحيث يتم إضافته إلى أقرب رقم عائم عند إضافته x + ulp (x).
import math

math.gcd(24, 36)
>> 12
math.lcm(12, 18)
>> 36
math.nextafter(3, -1)
>> 2.9999999999999996
3 - math.ulp(3)
>> 2.9999999999999996
math.nextafter(3, -1) + math.ulp(3)
>> 3.0 

الآن يمكن أن يكون أي تعبير صالح هو الديكور ( PEP-0614 )
تتم إزالة التقييد من الديكور ، والذي بموجبه لا يمكن إلا للاسم أن يعمل كمزخرف ويسمح بناءه بفصل النقاط فقط.

لا أعتقد أن الكثير من الناس فكروا في وجود مثل هذا التقييد ، ولكن وصف البيب يعطي مثالًا عندما يجعل الابتكار الرمز أكثر نحافة. بالقياس ، يمكننا الاستشهاد
مثال مبسط ومصطنع:
def a(func):
	def wrapper():
		print('a')
		func()
	return wrapper
	
def b(func):
	def wrapper():
		print('b')
		func()
	return wrapper
	
decorators = [a, b]

@decorators[0] #   3.8        
def some_func():
	print('original')
	
some_func()
>> a
>> original

تمت إضافة طريقة unparse (bpo -38870 ) إلى الوحدة النمطية ast ،
كما يوحي الاسم ، يمكنها تجميع السلسلة المصدر باستخدام الكائن ast.AST. ذات مرة ، كنت أرغب في استخدام هذا وكان من المستغرب عدم وجود مثل هذه الطريقة.
مثال:
import ast
parsed = ast.parse('import pprint; pprint.pprint({"one":1, "two":2})')
unparsed_str = ast.unparse(parsed)
print(unparsed_str)
>> import pprint
>> pprint.pprint({'one': 1, 'two': 2})
exec(unparsed_str)
>> {'one': 1, 'two': 2}

functools.TopologicalSorter class للفرز الطوبولوجي للرسوم البيانية الحلقية الموجهة ( bpo-17005 ) يجب
أن يكون الرسم البياني الذي يتم تمريره إلى الفارز قاموسًا تكون فيه المفاتيح هي رؤوس الرسم البياني ، والقيمة هي كائن قابل للتكرار مع الأسلاف (القمم التي تشير أقواسها إلى المفتاح). كمفتاح ، كالعادة ، أي نوع مجزأ مناسب.
مثال:
:

from functools import TopologicalSorter
graph = graph = {8: [3, 7], 11: [5, 7], 2: [11], 9: [8, 11], 10: [3, 11]}
t_sorter = TopologicalSorter(graph)
t_sorted_list = list(t_sorted_list.static_order()) #  ,    ,     static_order.
>> [3, 7, 5, 8, 11, 2, 9, 10]


, TopologicalSorter add. , , .

تمت إضافة الحالات الجديدة التي ننتظرها منذ فترة طويلة
إلى http.HTTPStatus : 103 EARLY_HINTS
418 IM_A_TEAPOT
425 تقريبًا

وبضعة تغييرات أخرى:
  • يتم تسريع الأنواع المضمنة (النطاق ، المجموعة ، المجموعة ، frozenset ، القائمة) ( PEP-590 )
  • "" .replace ("" ، s ، n) يعيد الآن s ، وليس سلسلة فارغة ، لجميع الأحرف غير الصفرية n. هذا صحيح لكل من البايت و bytearray.
  • يدعم ipaddress الآن تحليل عناوين IPv6 مع الوجهات.

نظرًا لأن الإصدار 3.9 لا يزال قيد التطوير ، وربما سيتم إضافة المزيد من التغييرات ، أخطط لتكملة هذه المقالة حسب الضرورة.

يمكنك أن تقرأ بمزيد من التفصيل:
docs.python.org/3.9/whatsnew/3.9.html
www.python.org/downloads/release/python-390a6
بشكل عام ، كي لا نقول أن التغييرات المستقبلية هي ما ينتظره الجميع منذ وقت طويل وبدون ذلك من المستحيل المرور ، بالرغم من وجود بعض النقاط الجيدة. وما الذي وجدته أكثر إثارة للاهتمام في الإصدار الجديد؟

UPD:
رابط محدث إلى الإصدار الأخير ؛
تمت إضافة PEP-0585 حول نوع التعليق التوضيحي

All Articles