تسطير في بيثون

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

ضع في اعتبارك سؤالًا محتملًا عن الرموز خلال مقابلة لموقف يتضمن معرفة لغة برمجة بيثون.

مهمة


هناك تعبيران:

  1. _+_ 
  2.  _|_ 

أي من هذين التعبيرين من المرجح أن يؤدي إلى أخطاء ولماذا؟

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

قرار


في Python ، الشرطة السفلية ليست كلمة رئيسية ؛ لذلك ، بشكل عام ، يمكن استخدامها لتعيين قيم معينة للمتغيرات.

يتم تقليل المهمة إلى النظر في حالات الأخطاء أثناء الإضافة ومع "bitwise أو" (للإيجاز ، ببساطة "أو") متغير واحد. أي للبحث عن أنواع Python المضمنة (الفئات) التي يتم تنفيذ عملية واحدة منها والبحث عن أنواع مضمنة حيث يتم تنفيذ عملية أخرى.

في وحدة التحكم Python ، من السهل التحقق من وجود قيم تسطير أسفل السطر مثل:

  1. لا يوجد خطأ في تقييم كل تعبير
     >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10 
  2. لا يوجد خطأ في تقييم التعبير الأول
     >>> _ = '10' >>> _+_ '1010' >>> _ = '10' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'str' and 'str' 
  3. لا يوجد خطأ في حساب التعبير الثاني
     >>> _ = {1, 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'set' and 'set' >>> _|_ {0, 1} 
  4. يوجد خطأ في حساب كل تعبير
     >>> _ = {1: 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'dict' and 'dict' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'dict' and 'dict' 

سحر بيثون هو أن تنفيذ الإضافات ، و "أو" ، والمشغلين الآخرين في ما يسمى "الأساليب السحرية" الموصوفة للفئات المطلوبة.
بالإضافة إلى ذلك ، هذه هي الطريقة

 __add__ 

بالنسبة لـ "أو" هذه طريقة

 __or__ 

يحتوي اسم كل طريقة سحرية على شرطات سفلية ، اثنتان في بداية الكلمة المقابلة وفي نهايتها.

العثور على معلومات حول بيثون الطبقات المدمجة.
يمكنك محاولة العثور على المعلومات المطلوبة في الوثائق الخاصة بالأنواع المضمنة على موقع Python الرسمي: https://docs.python.org/3.7/library/stdtypes.html .
يمكنك التنفيذ في محطة بيثون

 >>> import builtins >>> help(builtins) 

أفضل استخدام وثائق الإصدار الدقيق لبيثون الذي أستخدمه حاليًا ، في إشارة إلى واجهة الويب لوحدة pydoc.

للقيام بذلك ، في موجه الأوامر ، أدخل ، على سبيل المثال:

 python3 -m pydoc -p 3344 

وافتح وحدة وثائق المتصفح http: // localhost: 3344 / buildins.html .

فصول مدمجة يتم من خلالها تطبيق أساليبنا:
__add____or__
منطقيمنطقي
bytearrayfrozenset
بايتالباحث
مجمعمجموعة
عوامة
الباحث
قائمة
شارع
الصفوف (tuple)

تقوم تسعة فصول مدمجة بتنفيذ عملية الإضافة وتنفذ أربعة منها "أو".
بالإضافة إلى ذلك ، يمكنك محاولة التكهن بتكرار استخدام الفئات الأساسية في المشروعات الحقيقية ، والفئات غير الأساسية وتنفيذ الأساليب المذكورة أعلاه لهم. هذا من المرجح أن يكون موضع تقدير إيجابي خلال المقابلة.

الإجابة 1.
غالباً ما يؤدي التعبير الثاني إلى خطأ.



أسئلة إضافية ممكنة حول التأكيد على المقابلة


ما هو دور تسطير أسفل السطر في تسمية الكائنات؟


الإجابة 2.
يمكن استخدام الشرطة السفلية لفصل الكلمات في أنماط تسمية كيانات مختلفة في Python :

  1. عند تسمية في صغيرة

     lower_case_with_underscores 
  2. عند التسمية بأحرف كبيرة

     UPPER_CASE_WITH_UNDERSCORES 

بعض الأسماء المحددة بالشرطات السفلية محجوزة :

  1. مع تسطير أسفل السطر في بداية الاسم ، لا يتم استيراده أثناء الاستيراد العام

     from module import * 
  2. نظرًا لأن اثنين من الشرطة السفلية على جانبي الاسم يعتبران نظاميين ، فمن غير المستحسن استخدام هذه الأسماء لأغراض أخرى
  3. مع وجود شرطين سفليين في بداية الاسم ، فإنه يعتبر خاصًا (وليس عامًا) للفصل


ما هو دور تسطير واحد؟


الإجابة 3.
في المترجم الشفوي ، إذا لم يتم استخدام تسطير أسفل السطر بشكل صريح كمتغير ، فسيخزن نتيجة الإجراء الأخير الخالي من الأخطاء المعروض على الشاشة.

 $ python3 Python 3.6.8 (default, Feb 14 2019, 22:09:48) [GCC 7.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> _ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_' is not defined >>> 2 * 5 10 >>> _ 10 >>> _ = 1 >>> _ 1 >>> 2 * 5 10 >>> _ 1 

وذلك لأن sys.stdout يهرب مع عرض الخط . خذ مثالاً من الوثائق الرسمية :

 def displayhook(value): if value is None: return # Set '_' to None to avoid recursion builtins._ = None text = repr(value) try: sys.stdout.write(text) except UnicodeEncodeError: bytes = text.encode(sys.stdout.encoding, 'backslashreplace') if hasattr(sys.stdout, 'buffer'): sys.stdout.buffer.write(bytes) else: text = bytes.decode(sys.stdout.encoding, 'strict') sys.stdout.write(text) sys.stdout.write("\n") builtins._ = value 

بالإضافة إلى ذلك ، يتم استخدام تسطير واحد بشكل شائع لراحة الاستيعاب .

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


All Articles