Pythonetc أكتوبر 2018

الصورة

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

التحديدات السابقة:



فاصل -


يجب أن تقبل كل أداة مساعدة لسطر الأوامر اللائق الوسيطات في شكل خيارات (على سبيل المثال ، -h أو --help ) ، خيارات مع معلمات ( --log-level 2 ) أو معلمات موضعية ( cp file1 file2 ).

تختلف الخيارات عن المعلمات الموضعية من خلال وجود شرطة واحدة أو اثنتين في البداية. عندما تبدأ الحجج الموضعية بشرطة ، تنشأ مشاكل: إذا كنت تريد حذف ملف يسمى -rf ، فلن يساعدك الأمر rm -rf في ذلك.

الطريقة السهلة هي استخدام شُرطتين كفاصل. الحجج بعد - لا تعتبر خيارات:

$ echo test > -rf $ cat -rf cat: invalid option -- 'r' Try 'cat --help' for more information. $ cat -- -rf test $ rm -- -rf $ cat -- -rf cat: -rf: No such file or directory 

شرطتان مدعومتان بوحدة الوسيطة خارج الصندوق.

الاستقرار الفرز


الفرز القياسي في Python قوي ، ولا تغير الوظيفة المفرزة ترتيب الكائنات المتساوية:

 In : a = [2, -1, 0, 1, -2] In : sorted(a, key=lambda x: x**2) Out: [0, -1, 1, 2, -2] 

تتوافق وظيفتا min و max أيضًا مع الفرز. يعمل الحد الأقصى مثل فرز (أ ، عكس = صحيح) [0] ، ودقيقة يعمل مثل فرز ( أ) [0] . هذا يعني أن كلتا الوظيفتين تُعيدان أقصى إجابة ممكنة إلى اليسار:

 In : max([2, -2], key=lambda x: x**2) Out: 2 In : max([-2, 2], key=lambda x: x**2) Out: -2 In : min([2, -2], key=lambda x: x**2) Out: 2 In : min([-2, 2], key=lambda x: x**2) Out: -2 

ذاكرة التخزين المؤقت في الوسيطة الافتراضية


ربما يكون الخطأ الأكثر شيوعًا بين الأثرياء المبتدئين هو تحديد كائن قابل للتغيير كحجة للدالة الافتراضية. يمكن أن يؤدي فصل هذا الكائن بين استدعاءات الوظائف إلى أغرب النتائج:

 def append_length(lst=[]): lst.append(len(lst)) return lst print(append_length([1, 2])) # [1, 2, 2] print(append_length()) # [0] print(append_length()) # [0, 1] 

ومع ذلك ، ستكون هذه المشاركة مفيدة حتى إذا كنت تستخدم الكائن لإنشاء ذاكرة تخزين مؤقت مشتركة:

 def fact(x, cache={0: 1}): if x not in cache: cache[x] = x * fact(x - 1) return cache[x] print(fact(5)) 

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

 >>> fact.__defaults__ ({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},) 

العمل مع FS


يمكنك العمل مع مسارات نظام الملفات باستخدام الوحدة النمطية os.path . تحتوي الوحدة على العديد من الوظائف التي تتعامل مع السلاسل كمسارات للملفات وتجري عمليات مفيدة متنوعة عليها مثل التسلسل:

 >>> import os.path >>> os.path.join('/usr', 'local') '/usr/local' >>> os.path.dirname('/var/log') '/var' 

بدءًا من الإصدار 3.4 ، يشتمل Python على وحدة مسار pathlib التي تقدم نهجًا كائنيًا :

 >>> from pathlib import Path >>> Path('/usr') / Path('local') PosixPath('/usr/local') >>> Path('/usr') / 'local' PosixPath('/usr/local') >>> Path('/var/log').parent PosixPath('/var') >>> Path('/var/log').parent.name 'var' 

كائنات تسمى


في Python ، يمكنك إنشاء كائن قابل للاستدعاء ليس فقط عن طريق إنشاء وظائف (باستخدام صيغة def أو lambda ). يصبح الكائن قابلاً للاستدعاء إذا كان يحتوي على طريقة __call__ :

 class Truncater: def __init__(self, length): self._length = length def __call__(self, s): return s[0:self._length] print(Truncater(4)('abcdabcd')) # abcd 

نظرًا لأن الديكور هو في الأساس وظيفة ذات ترتيب أعلى ، فيمكن أيضًا التعبير عنها بواسطة الكائن المطلوب ، وليس وظيفة:

 class cached: def __init__(self, func): self._func = func self._cache = {} def __call__(self, arg): if arg not in self._cache: self._cache[arg] = self._func(arg) return self._cache[arg] @cached def sqr(x): return x * x 

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


All Articles