أفضل الممارسات في بايثون

أفضل الممارسات في بايثون

توضح هذه المقالة أفضل الممارسات في بايثون۔

سنشرح أفضل الممارسات في بايثون مع أمثلة عملية للكود، ونقدم طرق لكتابة كود قابل للقراءة والصيانة۔

YouTube Video

أفضل الممارسات في بايثون

اجعل القابلية للقراءة هي الأولوية القصوى

أولاً، دعونا ننظر إلى 'جعل القابلية للقراءة هي الأولوية القصوى.'۔

بايثون هي لغة تقدر 'قابلية القراءة'.۔ أولاً، أعطِ الأولوية لكتابة كود يوضح نواياك من النظرة الأولى۔

1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * b

في هذا الكود، أسماء المتغيرات لا توضح معناها، لذا يستغرق الآخرون وقتًا لفهمها لاحقًا۔

1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantity

من خلال جعل أسماء المتغيرات محددة، يصبح الكود نفسه توثيقًا۔

اكتب كودًا واضحًا وصريحًا

بعد ذلك، دعونا ننظر إلى 'كتابة كود واضح وصريح.'۔

في بايثون، 'النوايا الواضحة' مفضلة على 'السلوك الضمني.'۔

1# Bad example: implicit truthy check
2if data:
3    process(data)

في هذا الكود، من غير الواضح ما هو المتوقع من data، مما يخلق بيئة خصبة للأخطاء۔

1# Good example: explicit condition
2if len(data) > 0:
3    process(data)

من خلال جعل الشروط واضحة، تتطابق نية الكود مع المواصفات۔

اجعل الدوال صغيرة وتركز على مسؤولية واحدة

بعد ذلك، دعونا ننظر إلى 'جعل الدوال صغيرة وتركز على مسؤولية واحدة.'۔

عندما تقوم دالة واحدة بعدة أشياء، يصبح الاختبار والصيانة صعبين۔

1# Bad example: doing too many things
2def handle_user(user):
3    save_to_database(user)
4    send_email(user)
5    write_log(user)

في هذا الكود، تصبح العمليات مترابطة بشدة، مما يصعب إعادة الاستخدام والتعديل۔

1# Good example: single responsibility
2def save_user(user):
3    save_to_database(user)
4
5def notify_user(user):
6    send_email(user)
7
8def log_user(user):
9    write_log(user)

من خلال تقسيم الدوال، تصبح أدوارها واضحة ويصبح الاختبار أسهل۔

استخدم تلميحات النوع بشكل نشط

بعد ذلك، دعونا ننظر إلى 'الاستخدام النشط لتلميحات النوع.'۔

تعمل تلميحات النوع كتوثيق، وهي أداة قوية لمنع الأخطاء۔

1# Bad example: Without type hints
2def add(a, b):
3    return a + b

في هذا الكود، أنواع المعاملات وقيم الإرجاع غير واضحة، مما يجعل سوء الاستخدام أمرًا محتملًا۔

1# Good example: With type hints
2def add(a: int, b: int) -> int:
3    return a + b

مع تلميحات النوع، تتحسن الإكمال التلقائي في بيئة التطوير، والتحليل الثابت، وقابلية القراءة بشكل كبير۔

اشرح صراحةً إمكانية إرجاع None

بعد ذلك، دعونا ننظر إلى 'توضيح إمكانية إرجاع None بشكل صريح.'۔

غالبًا ما يتغاضى الأشخاص ممن يستخدمون دوال قد ترجع None عن احتمالية ذلك۔

1# Bad example: Ambiguous return value
2def find_user(user_id):
3    if user_id == 1:
4        return {"id": 1, "name": "Alice"}
5    return None

في هذا الكود، من غير الواضح ما إذا كان سيكون هناك قيمة معادة۔

1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5    if user_id == 1:
6        return {"id": 1, "name": "Alice"}
7    return None

باستخدام Optional، يمكنك توضيح إمكانية إرجاع None كنوع۔

لا تمسك الاستثناءات بشكل واسع جدًا

بعد ذلك، دعونا ننظر إلى 'عدم التقاط الاستثناءات بشكل واسع جدًا.'۔

يجب أن يلتقط التعامل مع الاستثناءات فقط ما هو ضروري أساسًا۔

1# Bad example: catching all exceptions
2try:
3    result = int(value)
4except Exception:
5    result = 0

قد يخفي هذا الكود أخطاء كان يجب الانتباه لها۔

1# Good example: catch specific exception
2try:
3    result = int(value)
4except ValueError:
5    result = 0

من خلال تقييد الاستثناءات، لن تتغاضى عن المشاكل غير المتوقعة۔

تعامل مع الموارد بأمان باستخدام عبارة with

بعد ذلك، دعونا ننظر إلى 'التعامل الآمن مع الموارد باستخدام عبارة with.'۔

يجب دائمًا تحرير الموارد مثل الملفات والأقفال بشكل موثوق۔

1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()

في هذا الكود، إذا حدث استثناء، قد لا يتم استدعاء close()۔

1# Good example: using context manager
2with open("data.txt") as file:
3    content = file.read()

باستخدام عبارة with، يتم تنفيذ عمليات التنظيف بأمان حتى عند حدوث استثناء۔

استخدم توليفات القوائم بطريقة مناسبة

بعد ذلك، دعونا ننظر إلى 'الاستخدام المناسب لتوليفات القوائم.'۔

يمكن كتابة عمليات التحويل البسيطة بشكل موجز باستخدام توليفات القوائم۔

1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4    squares.append(i * i)

في هذا الكود، من الصعب رؤية العملية الأساسية۔

1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]

باستخدام توليفات القوائم بشكل صحيح، تتحسن قابلية قراءة الكود۔

تجنب الأرقام السحرية

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

كتابة الأرقام والنصوص مباشرةً يجعل معناها غير واضح۔

1# Bad example: magic number
2if status == 404:
3    handle_not_found()

في هذا الكود، يُفترض أنك تعرف معنى 404۔

1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5    handle_not_found()

إعطاء الأسماء يُوضح النوايا۔

اكتب كودًا يمكن صيانته، وليس فقط كودًا 'يعمل'

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

النقطة المهمة هي ما إذا كان يمكنك أنت أو الآخرون قراءة الكود في المستقبل۔

1# Bad example: Hard to maintain
2def f(x):
3    return x * 1.08 + 100

في هذا الكود، لا يمكن فهم المواصفات من الكود۔

1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6    return price * TAX_RATE + BASE_FEE

من خلال عكس المعنى في الأسماء، يصبح الكود نفسه هو المواصفة۔

الملخص

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

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

YouTube Video