لقد نشرنا مؤخرًا
ترجمة للمواد ، والتي قدمت نصائح مفيدة لمبرمجي Python. تحتوي هذه المادة على تكملة نلفت انتباهكم إليها اليوم.

تسمية شريحة باستخدام وظيفة شريحة
يمكن أن يتحول العمل مع العديد من القيم المحددة بواسطة الفهارس بسرعة إلى فوضى - سواء من حيث الدعم أو من حيث إمكانية قراءة الكود. إحدى الطرق لتحسين الموقف هي استخدام الثوابت للقيم المحددة بواسطة الفهارس. ولكن هناك طريقة أفضل لكتابة رمز الجودة:
في هذا المثال ، يمكنك أن ترى أنه من خلال إعطاء أسماء الشرائح باستخدام وظيفة
slice
، واستخدام هذه الأسماء للحصول على أجزاء السلسلة ، تمكنا من التخلص من الفهارس المعقدة. يمكنك معرفة المزيد حول كائن
slice
باستخدام سماته
.stop
و
.step
و
.step
.
طلب كلمة مرور من المستخدم أثناء تنفيذ البرنامج
تتطلب العديد من أدوات سطر الأوامر أو البرامج النصية اسم مستخدم وكلمة مرور للعمل. إذا
getpass
إلى كتابة مثل هذا البرنامج ، فقد تجد وحدة
getpass
:
import getpass user = getpass.getuser() password = getpass.getpass()
تتيح لك هذه الحزمة البسيطة للغاية طلب كلمة مرور للمستخدم ، وكذلك الحصول على اسم مستخدم من خلال استعادة الاسم الذي قام بتسجيل الدخول بموجبه. ومع ذلك ، عند العمل باستخدام كلمات المرور ، يجب أن تدرك أن الأنظمة لا تدعم إخفاء كلمة المرور. ستحاول بايثون إخطارك. في حالة حدوث ذلك ، سترى تحذيرًا مطابقًا في سطر الأوامر.
العثور على مباريات قريبة في الاوتار
الآن دعنا نتحدث عن ميزة أكثر غموضًا في مكتبة Python القياسية. افترض أنك في موقف تحتاج إليه ، باستخدام مفهوم مثل
مسافة ليفينشتاين ، للعثور على كلمات في القائمة تبدو وكأنها سطر إدخال معين. يمكن حل هذه المشكلة باستخدام وحدة
difflib
.
import difflib difflib.get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'], n=2)
difflib.get_close_matches
طريقة
difflib.get_close_matches
عن أفضل المطابقات "الجيدة بدرجة كافية". تحدد الوسيطة الأولى من هذه الطريقة سلسلة البحث ، بينما تحدد الوسيطة الثانية القائمة التي يتم إجراء البحث فيها. يمكن تمرير هذه الطريقة وسيطة اختيارية
n
، والتي تحدد الحد الأقصى لعدد التطابقات التي يتم إرجاعها. تدعم هذه الطريقة أيضًا
cutoff
الوسيطة الاختياري المسمى (بشكل افتراضي ، يتم تعيينه على
0.6
) ، مما يسمح لك بتعيين قيمة عتبة لتقييم المطابقات.
العمل مع عناوين IP
إذا كان عليك كتابة برامج Python للعمل مع الشبكة ، فهذا يعني أن وحدة
ipaddress
يمكن أن تكون مفيدة لك. يتمثل أحد الخيارات لاستخدامه في إنشاء قائمة بعناوين IP من مجموعة من العناوين المحددة في تنسيق CIDR (التوجيه بدون فئة ، التوجيه بدون فئة).
import ipaddress net = ipaddress.ip_network('74.125.227.0/29')
ميزة أخرى مفيدة لهذه الوحدة هي التحقق من عنوان IP الخاص بالانتماء إلى شبكة معينة:
ip = ipaddress.ip_address("74.125.227.3") ip in net
تحتوي وحدة
ipaddress
على العديد من الميزات الأخرى المثيرة للاهتمام التي لا أتحدث عنها هنا. اقرأ المزيد عنه
هنا . صحيح ، باستخدام هذه الوحدة ، فكر في القيود المتعلقة بعملها المشترك مع الوحدات النمطية الأخرى ذات الصلة ببرمجة الشبكة. على سبيل المثال ، لا يمكنك استخدام مثيلات
IPv4Network
عناوين. يجب أولاً تحويل الكائنات المشابهة لهذا إلى سلاسل باستخدام
str
.
تصحيح برنامج في سطر الأوامر
إذا كنت أحد أولئك الذين لا يرغبون في استخدام IDE ويكتب رمز في Vim أو Emacs ، فقد تكون في موقف قد تحتاج فيه إلى مصحح أخطاء مثل تلك الموجودة في IDE. وانت تعرف ماذا؟ لديك بالفعل مثل هذا المصحح. لاستخدامه ، فقط قم بتشغيل البرنامج باستخدام بنية مثل
python3.8 -i
. يسمح العلم
-i
، عند الانتهاء من البرنامج ، لإطلاق قذيفة التفاعلية. باستخدامه ، يمكنك فحص المتغيرات ووظائف الاتصال. هذه هي ميزة مثيرة للاهتمام ، ولكن ماذا عن مصحح أخطاء حقيقي (pdb)؟ دعنا نجرب البرنامج البسيط التالي ، والذي يكون
script.py
ملف
script.py
:
def func(): return 0 / 0 func()
قم
python3.8 -i script.py
واحصل على ما يلي:
نرى مكان البرنامج الذي وقع فيه الحادث. تعيين نقطة توقف:
def func(): breakpoint()
قم بتشغيل البرنامج النصي مرة أخرى.
script.py(3)func()
-> return 0 / 0
(Pdb) #
(Pdb) step
ZeroDivisionError: division by zero
> script.py(3)func()
-> return 0 / 0
(Pdb)
في معظم الحالات ، تكون نتائج أمر التتبع والتتبع كافية لتصحيح البرامج النصية ، ولكن في بعض الأحيان للتعامل مع فشل معقد ، تحتاج إلى البحث في البرنامج وفهم جوهر ما يحدث. في مثل هذه الحالات ، يتم تعيين نقاط التوقف في التعليمات البرمجية ويتم فحص البرنامج. على سبيل المثال ، ينظرون إلى وسيطات الدوال ، وتقييم التعبيرات ، والتحقق من قيم المتغيرات ، أو كما هو مبين أعلاه ، قم بتنفيذ التعليمات البرمجية خطوة بخطوة. Pdb عبارة عن غلاف بيثون يعمل بكامل طاقته. في هذه القشرة ، يمكنك أن تفعل أي شيء تقريبًا. في سياق العمل ، ستصبح بعض أوامر تصحيح الأخطاء محددة في متناول اليد ، ويمكن العثور على المساعدة
هنا .
إعلان العديد من المنشئات في الفصل
الحمل الزائد للوظائف هو أحد الميزات المستخدمة على نطاق واسع في لغات البرمجة المختلفة ، ولكن ليس في Python. وعلى الرغم من أنه لا يمكنك زيادة التحميل على وظيفة عادية في Python ، إلا أنه يمكننا استخدام شيء مثل التحميل الزائد للمنشآت باستخدام أساليب الفصل:
import datetime class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def today(cls): t = datetime.datetime.now() return cls(t.year, t.month, t.day) d = Date.today() print(f"{d.day}/{d.month}/{d.year}")
في موقف مشابه ، بدلاً من استخدام أساليب الفصل ، قد تُغري لوضع كل منطق
**kwargs
البديلين في
__init__
وحل المشكلة باستخدام
*args
و
**kwargs
والكثير من
if
. قد تكون النتيجة هي رمز العمل ، ولكن سيكون من الصعب قراءتها وصيانتها. هنا أوصي بوضع الحد الأدنى من المنطق في
__init__
وتنفيذ جميع العمليات في طرق منفصلة / المنشئات. من خلال هذا النهج ، سيكون لدينا تحت تصرفنا رمزًا نظيفًا مناسبًا لكل من مؤلف هذا الرمز ولمن يستخدم هذا الرمز.
نتائج استدعاء وظيفة التخزين المؤقت باستخدام ديكور
هل سبق لك أن كتبت وظائف أدّت بعض عمليات القراءة / الكتابة المطولة ، أو إلى حد ما العمليات الحسابية البطيئة؟ في الوقت نفسه ، هل تعتقد أن تخزين النتائج مؤقتًا لن يضر بهذه الوظائف؟ يمكنك تخزين (استدعاء) نتائج استدعاء دالة
lru_cache
باستخدام أداة
lru_cache
من وحدة
functools
:
from functools import lru_cache import requests @lru_cache(maxsize=32) def get_with_cache(url): try: r = requests.get(url) return r.text except: return "Not Found" for url in ["https://google.com/", "https://martinheinz.dev/", "https://reddit.com/", "https://google.com/", "https://dev.to/martinheinz", "https://google.com/"]: get_with_cache(url) print(get_with_cache.cache_info())
في هذا المثال ، نقوم بتنفيذ طلبات GET التي يتم تخزين نتائجها مؤقتًا (يمكن تخزين ما يصل إلى 32 نتيجة في ذاكرة التخزين المؤقت). هنا يمكنك أن ترى أننا نحصل على معلومات حول ذاكرة التخزين المؤقت للوظائف باستخدام طريقة
cache_info
. يعطينا الديكور أيضًا طريقة
clear_cache
، والتي تُستخدم
clear_cache
ذاكرة التخزين المؤقت. أود هنا أيضًا ملاحظة أنه لا يمكن استخدام التخزين المؤقت مع وظائف لها آثار جانبية ، أو مع وظائف تنشئ كائنات قابلة للتغيير مع كل مكالمة.
البحث عن العناصر الموجودة في الكائن القابل للتكرار في أغلب الأحيان
تعد المشاركة في قائمة العناصر الموجودة فيها أكثر من غيرها مهمة شائعة جدًا. يمكنك حلها ، على سبيل المثال ، باستخدام حلقة
for
وقاموس ، والتي سوف تجمع معلومات حول عدد العناصر المتطابقة. لكن هذا النهج هو مضيعة للوقت. الحقيقة هي أنه يمكنك حل هذه المشكلات باستخدام فئة
Counter
من وحدة
collections
:
from collections import Counter cheese = ["gouda", "brie", "feta", "cream cheese", "feta", "cheddar", "parmesan", "parmesan", "cheddar", "mozzarella", "cheddar", "gouda", "parmesan", "camembert", "emmental", "camembert", "parmesan"] cheese_count = Counter(cheese) print(cheese_count.most_common(3))
تستند الآليات الداخلية للفئة
Counter
إلى قاموس يخزّن مراسلات العناصر وعدد الإدخالات في القائمة. لذلك ، يمكن استخدام الكائن المطابق ككائن
dict
منتظم:
print(cheese_count["mozzarella"])
بالإضافة إلى ذلك ، عند العمل مع
Counter
، لدينا تحت
update(more_words)
طريقة
update(more_words)
، والتي تُستخدم لإضافة عناصر جديدة إلى العداد. ميزة أخرى مفيدة لبرنامج
Counter
هي أنه يتيح لك استخدام العمليات الرياضية (الجمع والطرح) عند العمل مع مثيلات هذه الفئة.
النتائج
أعتقد أن معظم النصائح المقدمة اليوم قد تستخدم من قبل أولئك الذين يكتبون في بيثون بشكل شبه يومي. أتمنى أن تجد بينهم شيئًا مفيدًا لك.
أعزائي القراء! هل تعرف أي حيل بيثون البرمجة مثيرة للاهتمام؟ إذا كان الأمر كذلك ، يرجى مشاركتها.
