أعمل في الغالب مع بايثون وأراجع الكود بشكل يومي تقريبًا. في تنسيق قاعدة التعليمات البرمجية لدينا، يتم التعامل مع عملية الفحص بواسطة وظائف CI باستخدام الأسود وmypy. لذلك، نحن نركز فقط على التغييرات.
عند العمل ضمن فريق، فأنت تعرف بالفعل نوع التعليمات البرمجية التي تتوقعها من عضو معين في الفريق. تصبح مراجعات الكود مثيرة للاهتمام عندما ينضم شخص جديد إلى الفريق. أقول إنه أمر مثير للاهتمام، حيث أن كل شخص لديه أسلوب ما في البرمجة يستخدمه دون وعي؛ للخير أو للشر! مثل لدي بعض،
# I used (long back) to do def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None): if b is None: b = [] if c is None: c = {} # Instead I do def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None): b = b or [] c = c or {}
هذه حالة استخدام بسيطة حيث تقوم بإرجاع سلسلة أو استدعاء func بناءً على بعض القيمة
ملاحظة: من الإصدار 3.10 يجب عليك استخدام المطابقة بدلاً من هذا.
def get_number_of_wheels(vehicle: str): if vehicle == "car": wheels = 2 elif vehicle == "bus": wheels = 6 elif vehicle == "bicycle": wheels = 2 else: raise ... # I prefer doing, def get_number_of_wheels(vehicle: str): return { "car": 2, "bus": 6, "bicycle": 2 }[vehicle] # Raise is now KeyError
هناك بعض الأمثلة أعلاه، والأشخاص الذين يراجعون الكود الخاص بي سيكون لديهم المزيد من الأمثلة.
مؤخرًا، انضم مطور جديد إلى فريقي ولاحظت نمطًا أعجبني ولكنني طلبت تغييره إلى حالة بسيطة if..else. سأعرض لك النموذج أولاً ثم سأوضح سبب طلب التغيير.
الكود عبارة عن مصمم يقوم بعمل شيء ما للمعلمات. لنكتب ديكورًا بسيطًا (عديم الفائدة) والذي سيطبع عدد الوسائط وkwargs التي تم استدعاء الوظيفة/الطريقة بها.
def counter(is_cls_method: bool = False): """ print number of args & kwargs for func/method """ def outer(f): def inner(*args, **kwargs): args_cnt = len(args) kwargs_cnt = len(kwargs) print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}") return f(*args, **kwargs) return inner return outer @counter() def test1(a, b, c): pass class A: @counter(is_cls_method=True) def test1(self, a, b, c): pass print("function") test1(1, 2, c=3) test1(a=1, b=2, c=3) print("method") a = A() a.test1(1, 2, 3) a.test1(1, b=2, c=3)
عند تشغيل هذا الكود، يجب أن تشاهد
function test1 called with args_cnt=2 & kwargs_cnt=1 test1 called with args_cnt=0 & kwargs_cnt=3 method test1 called with args_cnt=4 & kwargs_cnt=0 test1 called with args_cnt=2 & kwargs_cnt=2
إنه يعمل بشكل جيد ولكن بالنسبة للطرق، فإنه يحسب نفسه أيضًا. لذلك دعونا إصلاح ذلك!
def counter(is_cls_method: bool = False): def outer(f): def inner(*args, **kwargs): args_cnt = len(args) if is_cls_method: # Check added args_cnt -= 1 # Reduced count by 1 kwargs_cnt = len(kwargs) print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}") return f(*args, **kwargs) return inner return outer
هذه عبارة if بسيطة، لكن المطور الجديد فعل شيئًا آخر كان استخدامًا مثيرًا للاهتمام للمنطق.
أظهر فقط الرمز الذي تم تغييره...
args_cnt = len(args[is_cls_method:])
الحل أفضل بكثير من استخدام if، حيث أن bool في python هو int فقط. كان الكود الأصلي أطول قليلاً، وملاحظة هذا التغيير الطفيف ليس واضحًا، كما أن قاعدة التعليمات البرمجية المستخدمة من قبل المستخدمين الأساسيين لبايثون. وإذا كان عليك تخمين ما يفعله الخط، فأعتقد أنه يجب عليك التغيير لجعله واضحًا.
ما رأيك في هذا، هل تستخدم القيمة المنطقية كمؤشر؟
هل لديك المزيد من أنماط بايثون مثل هذه؟
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3