أحدث ميزات بايثون

أحدث ميزات بايثون

تشرح هذه المقالة أحدث ميزات بايثون۔

سنشرح الميزات البارزة في إصدارات بايثون من 3.12 إلى 3.13 خطوة بخطوة من منظور عملي يركز على التطبيقات 'القابلة للاستخدام الفوري'۔

YouTube Video

أحدث ميزات بايثون

خلال السنوات الأخيرة، تطورت بايثون مع التركيز ليس فقط على 'سهولة الكتابة' بل أيضًا على 'المتانة، والسرعة، وقابلية القراءة'۔ فيما يلي، نقدم الميزات البارزة في إصدارات بايثون من 3.12 إلى 3.13۔

تحسينات كبيرة في رسائل الأخطاء (بايثون 3.12)

في بايثون 3.12، تُعرض الأخطاء الآن بشكل أكثر وضوحًا وبطريقة مرئية۔ يمكنك تحديد مكان الخطأ فورًا وتقليل وقت تصحيح الأخطاء بشكل كبير۔

1def calc_total(price, tax):
2    return price + price * tax
3
4result = calc_total(100, )
  • تُعرض الوسيطات المفقودة مع السطر والمكان المحدد، بحيث لن تشعر بالحيرة عند تحديد السبب۔

الاستخدام العملي لتعليمة 'match' (مطابقة الأنماط الهيكلية)

تتيح لك تعليمة 'match' وصف فروع الشروط المعقدة والتمييز بين هياكل البيانات بشكل إعلاني۔ يصبح التعامل مع القواميس والهياكل المتداخلة أكثر قابلية للقراءة بشكل خاص۔

1user = {"status": "active", "name": "Alice"}
2
3match user:
4    case {"status": "active", "name": name}:
5        print(f"Welcome back, {name}!")
6    case {"status": "inactive"}:
7        print("Please activate your account.")
8    case _:
9        print("Unknown user status.")
  • نظرًا لإمكانية إجراء تفرعات الشروط واستخراج البيانات في نفس الوقت، يصبح تعشيش تعليمة if غير ضروري۔

مطابقة أنماط بديهية للتعامل مع البيانات المتداخلة

تعليمة 'match' فعالة أيضًا للبيانات المهيكلة مثل JSON أو استجابات API۔

1data = {"user": {"name": "Bob", "age": 25}}
2
3match data:
4    case {"user": {"name": name, "age": age}}:
5        print(f"{name} is {age} years old.")
  • يمكنك استخراج العناصر الضرورية فقط بأمان، مما يقلل الحاجة لكتابة كود وقائي۔

تعزيز إخراج التصحيح لـ f-string (الترميز =` / بايثون 3.8 وما بعده، تحسين سهولة الاستخدام)

مع f-strings، يمكنك الآن إضافة = لعرض كل من التعبير ونتيجة تقييمه في نفس الوقت۔ هذه الميزة متخصصة في التصحيح ومفيدة جدًا عند الحاجة للتحقق السريع من محتوى متغير۔

1x = 10
2y = 20
3print(f"{x=}, {y=}, {x+y=}")
  • نظرًا لعرض أسماء المتغيرات وقيمها معًا، يصبح التصحيح المؤقت بواسطة جمل print() أسهل في القراءة۔
  • يمكنك كتابة مخرجات السجلات وكود التحقق بشكل أكثر إيجازًا وتعبيرًا۔

تلميحات النوع المبسطة والاسم المستعار 'type' (بايثون 3.12: صياغة جديدة للاسم المستعار للنوع)

في بايثون 3.12، تم تقديم صياغة خاصة لتعريف الأسماء المستعارة للأنواع — وهي تعليمة type۔ وهذا يسمح لتلميحات النوع أن تعمل ليس فقط كمعلومات تكميلية، بل كعنصر لغوي يعبر بوضوح عن هدف التصميم**۔

1type UserId = int
2type UserName = str
3
4def greet(user_id: UserId, name: UserName) -> str:
5    return f"Hello, {name} (id={user_id})"
  • من خلال إعطاء معنى لـ UserId أو UserName، يمكن توضيح اختلاف الأدوار حتى إذا استخدم كل منهما نفس النوع مثل int أو str۔
  • تصبح تعريفات الأنواع أكثر إيجازًا، مما يقلل تكلفة الفهم أثناء مراجعة وصيانة الكود۔
  • سابقًا، كانت أسماء الأنواع المستعارة مثل UserId = int تُنشأ كعمليات إسناد، لكن باستخدام تعليمة type يصبح الأمر واضحًا على أنه 'تعريف نوع'۔ هذا فعال بشكل خاص لتحسين قابلية قراءة التصميم في قواعد الشيفرة المتوسطة والكبيرة۔

تعليقات نوع طبيعية باستخدام الأنواع المدمجة (التعميم المبسط من بايثون 3.9 وما بعده)

منذ بايثون 3.9، يمكنك استخدام الأنواع المدمجة مثل list أو dict مباشرة كأنواع معماة۔

يسمح لك هذا بكتابة تلميحات نوع بديهية وسهلة القراءة دون الحاجة لاستيراد الأنواع من وحدة typing۔

1def sum_numbers(numbers: list[int]) -> int:
2    return sum(numbers)
3
4print(sum_numbers([1, 2, 3, 4]))
  • تعمل تلميحات النوع ليس كـ'قيود'، بل كـ'توثيق يشرح محتوى المعالجة'۔

سلسلة الطرائق الآمنة باستخدام نوع Self (بايثون 3.11 وما بعده)

منذ بايثون 3.11، يمكنك تحديد Self كنمط الإرجاع للطرائق التي تعيد نفس الفئة۔

يسمح لك ذلك بكتابة كود سلسلة الطرائق بشكل آمن دون فقدان معلومات النوع۔

 1from typing import Self
 2
 3class Counter:
 4    def __init__(self, value: int = 0) -> None:
 5        self.value = value
 6
 7    def increment(self) -> Self:
 8        self.value += 1
 9        return self
10
11counter = Counter()
12counter.increment().increment()
13print(counter.value)
  • حتى للطرائق التي تعيد self، يظل نوع الإرجاع الصحيح محفوظًا۔
  • يمكن لبيئات التطوير وفاحصي الأنواع فهم تسلسل الطرائق بدقة۔

معالجة النصوص بشكل أوضح (removeprefix / removesuffix | بايثون 3.9 وما بعده)

بدءًا من بايثون 3.9، تمت إضافة الطريقتين المخصصتين str.removeprefix() وstr.removesuffix() لـ إزالة البادئات واللواحق من النصوص بأمان۔ مع هاتين الطريقتين، يمكنك التعبير بدقة عن نية 'إزالة البداية أو النهاية فقط' في الكود۔

1filename = "report_2026.txt"
2
3clean_name = filename.removeprefix("report_")
4name_without_ext = clean_name.removesuffix(".txt")
5
6print(name_without_ext)
  • يتم إزالة النص المحدد فقط إذا كان موجودًا في البداية أو النهاية، مما يمنع الاستبدالات غير المقصودة.
  • هذا الأسلوب يوفر قابلية قراءة وسلامة أفضل مقارنة باستخدام replace() أو التقطيع.
  • خاصة عند التعامل مع 'نصوص ذات صيغة محددة' مثل أسماء الملفات أو معالجة الروابط، استخدام هذه الطرائق يمكن أن يقلل بشكل كبير من خطر حدوث الأخطاء۔

مقارنة النصوص المتينة لدعم التدويل (str.casefold() | دعم يونيكود)

str.casefold() في بايثون هي طريقة لإجراء مقارنة غير حساسة لحالة الأحرف وتأخذ في الاعتبار اليونيكود۔ على عكس lower() أو upper() البسيطة، فإنها تقوم بتوحيد النصوص بما في ذلك تحويل الأحرف الخاص باللغات۔

1text1 = "Stra\u00dfe"
2text2 = "strasse"
3
4print(text1)
5print(text2)
6
7print(f"Comparison Result: {text1.casefold() == text2.casefold()}")
  • يمكنها التعامل بشكل صحيح مع الاختلافات المعتمدة على اللغة مثل الأحرف الألمانية ß وss۔
  • هذه تقنية أساسية للتطبيقات المعتمدة على دعم تعدد اللغات أو التدويل۔

دعم TOML القياسي (tomllib | بايثون 3.11 وما بعده)

منذ بايثون 3.11، تمت إضافة وحدة tomllib لقراءة ملفات إعدادات TOML إلى المكتبة القياسية۔ يمكن الآن إدارة الإعدادات بالكامل في بايثون، دون الاعتماد على مكتبات خارجية۔

 1import tomllib
 2
 3with open("config.toml", "rb") as f:
 4    config = tomllib.load(f)
 5
 6print(config["database"]["host"])
 7
 8# config.toml
 9# title = "TOML Example"
10# [database]
11# host = "192.168.1.1"
12# ports = [ 8001, 8001, 8002 ]
  • لم تعد هناك حاجة لحزم خارجية مثل toml، مما يُبسط التبعيات۔
  • أصبح تحميل ملفات الإعدادات موحدًا، مما يجعل التوزيع والتشغيل وبيئات التكامل المستمر أسهل في التعامل معها۔

معالجة الاستثناءات في عصر المعالجة المتوازية (ExceptionGroup / except* | بايثون 3.11 وما بعده)

قدم بايثون 3.11 ExceptionGroup لمعالجة عدة استثناءات معًا وكذلك صياغة except* للتعامل معها بأمان في الفروع۔ هذه ميزة جديدة لمعالجة 'الأخطاء المتزامنة' التي تظهر في المعالجة غير المتزامنة أو الموازية۔

 1def process(values):
 2    errors = []
 3    for v in values:
 4        if v < 0:
 5            errors.append(ValueError(f"Negative value: {v}"))
 6    if errors:
 7        raise ExceptionGroup("Invalid values", errors)
 8
 9try:
10    process([1, -2, -3])
11except* ValueError as e:
12    print("Handled:", e)
  • يمكن الآن إثارة وتصنيف عدة استثناءات في عملية واحدة۔
  • يحل مشكلة المعالجة غير المتزامنة حيث لا يظهر إلا الخطأ الأول فقط۔
  • في عمليات مثل asyncio.gather() أو معالجة الدُفعات بالتوازي، يمكن أن تحدث عدة عوامل فشل في وقت واحد۔ استخدام ExceptionGroup يجعل من السهل تنظيم تجميع الأخطاء وتسجيلها واستراتيجيات إعادة المحاولة۔

تحسين الأداء ببساطة عن طريق التحديث إلى أحدث إصدار

بدءًا من بايثون 3.11، تم تسريع العديد من العمليات من خلال تحسينات داخلية۔

1def count_up(n):
2    total = 0
3    for i in range(n):
4        total += i
5    return total
6
7print(count_up(1_000_000))
  • الميزة الكبرى هي أنه يمكنك تحقيق تحسينات السرعة دون إعادة كتابة الكود۔

التحكم في جمع القمامة (الإدارة اليدوية عن طريق وحدة gc)

في بايثون، يسمح لك استخدام وحدة gc القياسية بـ تعطيل أو تنفيذ جمع القمامة يدويًا بشكل مؤقت۔ هذه تقنية تحسين فعالة في سيناريوهات مثل معالجة البيانات على دفعات كبيرة أو العمليات الحساسة للأداء۔

1import gc
2
3gc.disable()
4# heavy batch processing
5gc.enable()
6gc.collect()
  • قمع تنشيط جمع القمامة غير الضروري يمكن أن يقلل من التقلبات في وقت المعالجة۔
  • يمكنك جمع القمامة يدويًا في فترات محددة أثناء العملية، مما يسهل تتبع استخدام الذاكرة۔
  • ومع ذلك، لا ينبغي استخدام هذه التقنية كتحسين افتراضي، بل فقط إذا أظهرت ملفات التحليل أن جمع القمامة يمثل عنق زجاجة۔ بالنسبة لمعظم التطبيقات، من الأكثر أمانًا الاعتماد على جمع القمامة التلقائي في بايثون۔

الملخص

مع التحسينات في رسائل الأخطاء وتطور تلميحات الأنواع في إصدارات بايثون من 3.12 إلى 3.13، أصبح فهم الكود وصيانته أسهل من أي وقت مضى۔ بالإضافة إلى ذلك، فإن التحسينات مثل تحسين تجربة التصحيح وتطوير الأداء من خلال التحسينات الداخلية تساهم بشكل مباشر ومستمر في زيادة الإنتاجية العملية۔ لا تحتاج إلى استخدام جميع هذه الميزات الجديدة مرة واحدة؛ من العملي البدء بأحدث إصدار من بايثون وإدخال الميزات تدريجيًا حسب الحاجة۔ يساهم هذا الاعتماد التدريجي في جعل كود بايثون أكثر قابلية للقراءة والمتانة۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video