الإصدار الجديد متوقع فقط في أكتوبر ، ولكن يمكنك بالفعل قراءة ما ينتظرنا فيه واختبار الإصدار الأولي.في هذه المقالة ، التغييرات الأكثر إثارة للاهتمام ، في رأيي.
أولاً ، يتم تذكيرنا بأن الطبقات التي تدعم التوافق العكسي مع الإصدار 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
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_HINTS418 IM_A_TEAPOT425 تقريبًاوبضعة تغييرات أخرى:- يتم تسريع الأنواع المضمنة (النطاق ، المجموعة ، المجموعة ، frozenset ، القائمة) ( PEP-590 )
- "" .replace ("" ، s ، n) يعيد الآن s ، وليس سلسلة فارغة ، لجميع الأحرف غير الصفرية n. هذا صحيح لكل من البايت و bytearray.
- يدعم ipaddress الآن تحليل عناوين IPv6 مع الوجهات.
نظرًا لأن الإصدار 3.9 لا يزال قيد التطوير ، وربما سيتم إضافة المزيد من التغييرات ، أخطط لتكملة هذه المقالة حسب الضرورة.يمكنك أن تقرأ بمزيد من التفصيل:docs.python.org/3.9/whatsnew/3.9.htmlwww.python.org/downloads/release/python-390a6بشكل عام ، كي لا نقول أن التغييرات المستقبلية هي ما ينتظره الجميع منذ وقت طويل وبدون ذلك من المستحيل المرور ، بالرغم من وجود بعض النقاط الجيدة. وما الذي وجدته أكثر إثارة للاهتمام في الإصدار الجديد؟UPD:رابط محدث إلى الإصدار الأخير ؛تمت إضافة PEP-0585 حول نوع التعليق التوضيحي