تضمين التغريدةPythonetc ديسمبر 2018



هذا هو الاختيار السابع لنصائح Python والبرمجة من خلاصتيpythonetc.

الاختيارات السابقة:


سياقات متعددة


في بعض الأحيان قد يكون من الضروري تشغيل مجموعة من التعليمات البرمجية في العديد من مديري السياق:

with open('f') as f: with open('g') as g: with open('h') as h: pass 

منذ Python 2.7 و 3.1 ، يمكن القيام بذلك بتعبير واحد:

 o = open with o('f') as f, o('g') as g, o('h') as h: pass 

من قبل ، يمكنك استخدام دالة contextlib.nested :

 with nested(o('f'), o('g'), o('h')) as (f, g, h): pass 

إذا كنت تعمل مع عدد غير محدد من مديري السياق ، فمن الأفضل اختيار المزيد من الأدوات المتقدمة. contextlib.ExitStack يسمح لك بإدخال أي عدد من السياقات في أي وقت ويضمن الخروج منها في نهاية التنفيذ:

 with ExitStack() as stack: f = stack.enter_context(o('f')) g = stack.enter_context(o('g')) other = [ stack.enter_context(o(filename)) for filename in filenames ] 

كائنات في ذاكرة مترجم


يمكن الوصول إلى جميع الكائنات الموجودة حاليًا في ذاكرة gc.get_objects() باستخدام gc.get_objects() :

 In : class A: ...: def __init__(self, x): ...: self._x = x ...: ...: def __repr__(self): ...: class_name = type(self).__name__ ...: x = self._x ...: return f'{class_name}({x!r})' ...: In : A(1) Out: A(1) In : A(2) Out: A(2) In : A(3) Out: A(3) In : [x for x in gc.get_objects() if isinstance(x, A)] Out: [A(1), A(2), A(3)] 

أرقام


 In : int('୧৬༣') Out: 163 

0 1 2 3 4 5 6 7 8 9 ليست الأحرف الوحيدة التي تعتبر أرقامًا. بيثون يتبع قواعد يونيكود ويعد عدة مئات من الأحرف كأرقام. قائمة كاملة هنا .

هذا مهم بالنسبة لوظائف مثل int و unicode.isdecimal وحتى re.match :

 In : int('௯') Out: 9 In : '٢'.isdecimal() Out: True In : bool(re.match('\d', '౫')) Out: True 

UTC منتصف الليل


 >>> bool(datetime(2018, 1, 1).time()) False >>> bool(datetime(2018, 1, 1, 13, 12, 11).time()) True 

قبل Pyhon 3.5 ، تم اعتبار كائنات datetime.time() خاطئة إذا كانت تمثل منتصف الليل UTC. هذا يمكن أن يؤدي إلى الأخطاء غير واضحة. في المثال التالي ، if not قد تفشل لأنه لا create_time
None ، ولكن لأنه منتصف الليل.

 def create(created_time=None) -> None: if not created_time: created_time = datetime.now().time() 

يمكنك التغلب على هذا الخطأ عن طريق التحقق بوضوح من "بلا": if created_time is None .

العمل غير المتزامن في FS


لا تدعم Python عمليات الملفات غير المتزامنة. لجعلها غير محظورة ، عليك استخدام مؤشرات الترابط.

لتنفيذ التعليمات البرمجية غير المتزامنة في دفق ، تحتاج إلى استخدام أسلوب loop.run_in_executor .

تستطيع وحدة aiofiles لجهة خارجية القيام بذلك نيابة عنك ، مما يوفر واجهة مريحة وبسيطة:

 async with aiofiles.open('filename', mode='r') as f: contents = await f.read() 

Source: https://habr.com/ru/post/ar436322/


All Articles