سؤال

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

كيف يمكن أن يحدث فرقا؟هل هناك أسباب أخرى وراء استخدام المسافات بدلاً من علامات التبويب في Python؟أم أن هذا ببساطة غير صحيح؟

هل يجب أن أقوم بتبديل المحرر الخاص بي لإدراج مسافات بدلاً من علامات التبويب على الفور أم الاستمرار في العمل كما اعتدت؟

هل كانت مفيدة؟

المحلول

لأن بيب-8 يخبرنا باستخدام المساحات.

نصائح أخرى

هل سئمت من ملاحقة الأخطاء المطبعية (8 مسافات؟لا 7 عفوا 9 ...) لقد قمت بتحويل مصادري إلى "علامات التبويب فقط".

علامة تبويب واحدة == مستوى مسافة بادئة واحدة، نقطة توقف

المقصود هو:إذا كنت تريد عرض المسافة البادئة بعرض 4 أو 8 أو pi / 12 حرفًا، فما عليك سوى تغيير الإعدادات في محرر النصوص الخاص بك، ولا تعبث بالرمز.

(أنا شخصياً أستخدم علامة تبويب بعرض 4 أحرف ...ولكن البعض يفضل مسافة 3 أو 8، أو حتى استخدام خطوط ذات عرض متغير.)

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

استخدم محررًا يعرض أحرف علامة التبويب (كل المسافات البيضاء، في هذا الشأن).أنت تبرمج ولا تكتب مقالاً.

أستخدم علامات التبويب.لا يوجد مجال للخطأ بمسافة واحدة في علامات التبويب (إذا كان بإمكانك رؤيتها).المشكلة هي أن الناس يستخدمون محررين مختلفين، والشيء الوحيد المشترك في العالم هو:tab==مسافة بادئة، كما هو مذكور أعلاه.يأتي بعض الأشخاص مع تعيين مفتاح tab على عدد خاطئ من المسافات أو يفعل ذلك يدويًا ويحدث فوضى.علامات التبويب واستخدام محرر حقيقي.(هذا لا يتعارض فقط مع PEP، بل يتعلق أيضًا بـ C/C++ واللغات الأخرى التي لا تحتوي على مسافات بيضاء).

/ يتنحى عن المنبر

السبب الرئيسي لاستخدام علامات التبويب على المسافات هو مفتاح مسافة للخلف.إذا كنت على سطر وأريد إزالة المسافة البادئة للخلف على هذا السطر فقط، فلا بد لي من الضغط على مسافة للخلف 4x إذا كانت مسافات؛بينما أحتاج فقط إلى الضغط عليها مرة واحدة إذا كانت علامة تبويب.

سأستمر في استخدام علامات التبويب لأنه - كما ذكرنا من قبل - من الأسهل التحويل من علامات التبويب إلى مسافات، ولكن ليس العكس.

أعتقد أنني أريد أن أكتب برنامجًا بسيطًا يحول التعليمات البرمجية ذات المسافات إلى تعليمات برمجية ذات علامات تبويب، لأنني أكره المسافات بشدة.إنهم يقودونني إلى أعلى الحائط!

أوه!واستخدام مفاتيح الأسهم للتنقل يمينًا ويسارًا يمثل دائمًا ألمًا في المؤخرة عندما تكون هناك مسافات.

تحديث:يقوم Sublime Text 3 الآن بحذف علامة التبويب الكاملة باستخدام مفتاح مسافة للخلف؛على الرغم من ذلك، لا يزال التنقل باستخدام مفاتيح الأسهم أمرًا شاقًا.

Tabs vs. Spaces for Indentation

تحديث:أنا الآن استخدم vscode وكتب أيضا أ ملحق TabSanity لحل مشكلة مسافة للخلف والحذف والتنقل باستخدام مفتاح السهم.

TabSanity Extension in Action

الطريقة الأكثر "بيثونية" هي استخدام 4 مسافات لكل مستوى مسافة بادئة.ومع ذلك، سيتعرف مترجم Python على المسافات أو علامات التبويب.الممسك الوحيد هو أنت يجب ألا تخلط المسافات وعلامات التبويب أبدًا, ، اختيار واحد أو آخر.ومع ذلك، توصي المواصفات بمسافات، ومعظم المطورين يستخدمون مسافات، لذلك ما لم يكن لديك سبب وجيه لعدم القيام بذلك، سأقول استخدم مسافات.

بقدر ما أستطيع أن أقول، إليك إيجابيات وسلبيات علامات التبويب مقابل المسافات.

إيجابيات علامات التبويب:

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

سلبيات علامات التبويب:

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

هناك بعض الأمور التي يبالغ فيها البعض:

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

  2. لا يمكنك محاذاة الأشياء بسهولة مع علامات التبويب:هذا صحيح إذا كنت تريد محاذاة مثالية للأحرف، لكن PEP-8 ينصح بعدم القيام بذلك، ولا تعمل لغة Python بشكل جيد مع البيانات متعددة الأسطر على أي حال.

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

لقد بدأت باستخدام المسافات لتكون متسقة مع أكواد Python الأخرى، ولكن لأكون صادقًا، كان الأمر محبطًا بدرجة كافية لدرجة أنني ربما سأعود مرة أخرى إلى علامات التبويب.يعتمد الكثير على إمكانيات IDE الخاص بك، ولكن في تجربتي، لا يوجد قدر من دعم IDE للمسافة البادئة للمسافة يكون جيدًا مثل مجرد استخدام علامات التبويب.

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

تحديث:لقد اكتشفت أن هناك محررًا واحدًا في العالم كله (باستثناء الهراء مثل Vim) يدعم المسافات بشكل صحيح كمسافة بادئة:ذرة.يحتوي على خيار يسمى "علامات التبويب الذرية" الذي يجعل 4 مسافات تتصرف كما لو كانت علامة تبويب من جميع النواحي (باستثناء القدرة على تغيير حجمها).للأسف، يعد Atom محررًا بطيئًا ومتضخمًا، ولكن هذه ميزة رائعة وإذا كنت مجبرًا على استخدام المسافات فقد يكون خيارًا جيدًا.نأمل أن يبدأ المحررون الآخرون في دعمها يومًا ما. هذه هي المشكلة بالنسبة لـ VSCode.

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

أعتقد أنه من الصحيح أن معظم مبرمجي بايثون يستخدمون المسافات فقط.

استخدم محررًا يسمح لك بإدراج مسافات حتى علامة الجدولة عند الضغط على المفتاح TAB، بدلاً من إدراج الحرف .ثم ننسى ذلك.

يمكنك مزج علامات التبويب والمسافات...ولكن تعتبر علامة التبويب هي نفس المسافة البادئة التي تحتوي على 8 مسافات، لذلك ما لم يتم إعداد المحرر الخاص بك لاعتبار علامة التبويب 8 مسافات، فإنك ستواجه مشكلة عند مزجها.

الإزعاج الوحيد الذي أواجهه عند استخدام المسافات بدلاً من علامات التبويب هو أنه لا يمكنك بسهولة إزالة مستوى المسافة البادئة؛يجب عليك إزالة أربع مسافات بدلاً من علامة تبويب واحدة فقط.

حكم علامات التبويب.نفس الوسيطة للحلقات المتداخلة وتريد إعادة الحلقة الخارجية إلى المستوى 1.نصيحة:إذا كنت تريد تحويل تعليمات برمجية python القديمة المليئة بالمسافات إلى علامات تبويب، فاستخدم الأداة المساعدة TabOut المتوفرة كملف قابل للتنفيذ على http://www.textpad.com/add-ons/.

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

يحدث خطأ من محرر إلى محرر عندما يكون لديك المسافة البادئة المختلطة داخل الملف.وينشأ هذا على النحو التالي:يتم وضع مسافة بادئة لكتلة التعليمات البرمجية بأربع مسافات، ثم مستوى مسافة بادئة واحدة "في"، ويتم وضع مسافة بادئة لها بعلامات الجدولة.الآن الوثني الذي فعل هذا (خلط علامات التبويب والمسافات) كان لديه ذلك بحيث تكون علامات التبويب الخاصة به أيضًا 4 مسافات، لذلك لا يرى أي مشاكل، ولا يرى بايثون أي مشاكل.

الآن يأتي ضحيتنا لاحقًا، وقد تم ضبط علامات التبويب الخاصة به على 8 مسافات.الآن يعتقد ضحايانا أن الكود يبدو مخترقًا تمامًا، و يصلحه بواسطة إزالة مستوى واحد من المسافة البادئة, ، الذي يصنع الكود الآن ينظر كما لو أنه لا يزال 2 مستويات المسافة البادئة، ولكن هو حقا مستوى واحد.عند هذه النقطة ينفجر كل الجحيم.

الدرس المستفاد هنا هو أنه لا ينبغي عليك أبدًا الخلط بين علامات التبويب والمسافات.إذا التزمت بهذا، فمن السهل إعادة وضع الكود الخاص بك في مسافات أو علامات تبويب، بغض النظر عما تستخدمه شخصيًا.أفضل طريقة لضمان عدم الخلط بين علامات التبويب والمسافات هي التشغيل دائمًا python مع -tt, ، مما سيؤدي إلى حدوث خطأ عند خلط علامات التبويب والمسافات.

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

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

  1. أولاً، من المهم أن نفهم كيف تفسر بايثون المسافة البادئة.ذكر برايان أوكلي إمكانية حدوث أخطاء متتابعة عند استخدام علامات التبويب، ولكن هذا غير ممكن في الواقع مع إعدادات المترجم الفوري.هناك تفسير أفضل لهذا في تعلم بايثون, ، من أورايلي وسائل الإعلام.

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

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

  1. ثانيًا، يهدف جزء كبير من التصميم النحوي لـ Python إلى تشجيع إمكانية قراءة التعليمات البرمجية والأسلوب المتسق بين المبرمجين في نفس المشروع.ومع ذلك، يصبح السؤال، بالنسبة لأي مشروع معين، ما الذي سيجعل الكود أكثر قابلية للقراءة من قبل الأشخاص العاملين في المشروع.من المؤكد أنها فكرة جيدة أن تحافظ على نمط مسافة بادئة متسقة، ولكن اعتمادًا على النظام الأساسي والمحرر الذي يستخدمه المشروع، قد يكون النمط المختلف منطقيًا لمشاريع مختلفة.إذا لم يكن هناك سبب مقنع لعدم الالتزام به بيب 8, فمن المنطقي أن نفعل ذلك، لأنه سيتوافق مع ما يتوقعه الناس.

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

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

أيضًا، لدى Python 2.x خيار -t لإصدار تحذيرات بشأن علامات التبويب والمسافات المختلطة و -tt لإصدار خطأ.ينطبق هذا فقط على علامات التبويب والمسافات المختلطة داخل نفس النطاق.يفترض بايثون 3 -tt وبقدر ما وجدت، لا توجد وسيلة لتعطيل هذا الاختيار.

أنا مبرمج في لغة C++ بشكل أساسي، لكن في بعض الأحيان تشتمل مشاريعي على كميات صغيرة من لغة Python.أستخدم علامات التبويب لوضع مسافة بادئة لرمز C++ الخاص بي.وهذا يعني أن لدي ثلاثة خيارات هنا:

  1. استخدم علامات التبويب في C++ والمسافات في Python.يسمح هذا لملفات C++ الخاصة بي بالبقاء كما هي وأنا أتبع توصية PEP-8، لكنني غير متسق مع مشروعي.
  2. قم بتغيير كود C++ الخاص بي لاستخدام المسافات.يسمح هذا لجميع ملفاتي ضمن مشروعي بأن تكون متسقة، وأنا أتبع توصية PEP-8، لكنه يتطلب مني العودة وتغيير جميع ملفات C++ الخاصة بي.أنا أعتبر هذا أمرًا سيئًا لأنني أفضل علامات التبويب.
  3. استخدم علامات التبويب في كود C++ الخاص بي وكود Python.وهذا يجعل مشروعي بأكمله متسقًا ويسمح لي باستخدام أسلوب المسافة البادئة المفضل لدي:نوافذ التبويب.الجانب السلبي هو أنني لا أتبع معيار PEP-8.

بالنسبة لمشاريعي، عادةً ما أختار الخيار 3.

الخبرة و بيب-8 كلاهما يستنتج بوضوح أن خلط المساحات و TABيجب تجنبه.إذا كنت ترغب في مزجها، فيجب عليك تصور المسافة البيضاء في IDE - ولكن بعد ذلك تفقد ميزة المسافة البادئة في Python مما يجعل النطاقات مرئية بسهولة.يؤدي تصور المسافة البيضاء في IDE إلى ازدحام الشاشة.

إذا كان إما علامات التبويب أو مسافات، فلا بد أن تكون مسافات لسبب بسيط:يمكن للمرء تبديل جميع بيئات التطوير المتكاملة ومحررات النصوص تقريبًا لاستبدال علامات التبويب بمسافات تلقائيًا، ولكن العكس ليس صحيحًا.

على الرغم من وجود بيئة تطوير متكاملة يمكنها تحويل المسافات البادئة في السطر إلى علامات جدولة تلقائيًا، إلا أن هذا سيؤدي في النهاية إلى وجود مزيج من علامات التبويب والمسافات.فكر في عبارات متعددة الأسطر مثل استدعاءات الوظائف التي تحتوي على الكثير من المعلمات أو سلاسل المستندات.في حين أنه يجب تجنب "ascii-art" أيضًا، فقد يحدث بسهولة عن طريق الصدفة ترك مسافة واحدة بعد علامات التبويب البادئة.

جلبت الإجابات الأخرى عدة حجج لصالح علامات التبويب:

  • ضرب TAB هو أكثر كفاءة.بالطبع هذا صحيح، لكن جميع برامج تحرير النصوص تسمح بإدخال العدد المطلوب من المسافات فورًا عند الضغط على مفتاح tab
  • المسافة البادئة/المسافة البادئة تكون أسهل عند الاضطرار إلى إزالة علامة تبويب واحدة بدلاً من مسافات 2/3/4/8.هذا صحيح، ولكن معظم برامج تحرير النصوص تسمح بذلك تلقائيًا على أي حال:يعد تحديد الكتلة والمسافة البادئة/المسافة البادئة من الوظائف الأساسية لمحرر البرمجة، مثل التعليق/إلغاء التعليق.إذا لم يقم محرر النصوص بتنفيذ ذلك، فيجب أن يتمتع على الأقل بوظيفة ماكرو سهلة الاستخدام يمكن من خلالها تحقيق نفس الشيء.
  • المبرمجون المختلفون يحبون عروض المسافة البادئة المختلفة.وهذا صحيح، وميزة واضحة للاستخدام TABق فقط.تكمن المشكلة في التفاعل مع الأفراد و/أو الفرق الأخرى.لكي ينجح هذا في العالم الحقيقي، يجب أن يتفق الجميع على كل استخدام TABق فقط.وبما أن هذا لم يحدث، فإنه لا يعمل على أي حال.في سيناريو العالم الحقيقي، هناك مجموعة من إرشادات البرمجة التي يوافق عليها المشروع على أي حال، ومن المؤكد أن طريقة المسافة البادئة هي واحدة منها - حتى في لغات البرمجة الأخرى حيث تكون الآثار "فقط" على المستوى المرئي.

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

لا توجد إجابة كاملة دون الرابط الذي قدم جريج في إجابته بالفعل: بايثون:أساطير حول المسافة البادئة

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

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

def foobar():
    x = some_call(arg1,
                  arg2)

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

لن يكون هذا هو الحال ولكن عند استخدام مستند نمط/اتفاقيات الترميز الذي يتجنب المواقف كما في مثال الكود أعلاه.

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

حجم الملف الأصغر يعني سرعة التحميل والتجميع والتنفيذ (في بعض الحالات)، وما إلى ذلك.

بالنسبة لي، ليس هناك أي فائدة من استخدام المسافات، ولكن إذا كان شخص ما يستخدم محررًا به مشكلات مع علامات التبويب، فيمكنه استبدال " " بـ " " أو " " أو أي شيء آخر...

بالإضافة إلى جميع الحجج المذكورة بالفعل، أجد أن هذه واحدة مهمة إلى حد ما (من خرافات حول المسافة البادئة):

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

هناك حجة أخرى (خاصة بالبيئة بشدة) ضد علامات التبويب وهي أنها كذلك مفقودة في بعض الأحيان على لوحات مفاتيح الهاتف.ربما يمكن معالجة ذلك عن طريق تثبيت لوحة مفاتيح بديلة، حيثما أمكن ذلك.

حجة ل علامات التبويب التي يبدو أن أحداً لم يذكرها بعد هي أن علامة التبويب الواحدة تتكون من حرف واحد (0x09، 1 بايت في الملف)، في حين أن 4 مسافات عبارة عن 4 أحرف (4 مرات 0x20، 4 بايت في الملف)؛وبالتالي، يؤدي استخدام المسافات إلى إهدار المساحة بمقدار 4x.

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

معيار بيثون "المساحات فقط" هو الرمز الموزع.لقد علمتنا سنوات من الخبرة المبكرة دون أدنى شك في أن علامات التبويب تسببت في مشاكل لا نهاية لها مشترك شفرة (...)

كيف يمكن أن يحدث فرقا؟

يتم تكوين بعض برامج التحرير بشكل افتراضي لاستبدال حرف علامة تبويب واحد بعدد محدد من أحرف المسافات، ولكن البعض الآخر لا يتم تكوينه.إذا كان الجميع يستخدم المسافات، فيمكن تجاهل هذا الاختلاف في إعدادات المحرر الافتراضية.

هل هناك أسباب أخرى وراء استخدام المسافات بدلاً من علامات التبويب في Python؟أم أن هذا ببساطة غير صحيح؟

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

هل يجب أن أقوم بتبديل المحرر الخاص بي لإدراج مسافات بدلاً من علامات التبويب على الفور أم الاستمرار في العمل كما اعتدت؟

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

  • إذا بدأت العمل على قاعدة تعليمات برمجية موجودة بالفعل:لا تكن صعبًا، اتبع معيار الترميز الحالي
  • إذا بدأ الفريق في مشروع جديد من الصفر:ناقش، وحدد معيارًا للبرمجة في البداية كفريق واحد، والتزم به
  • إذا كنت ستذهب بمفردك:افعل كل ما يجعلك تشعر بالسعادة والأكثر إنتاجية

إذن ما هو الوضع الذي تقع فيه؟

أخيرًا، لتوضيح موقفي، بالنسبة لمشاريعي الفردية، أستخدم علامات التبويب لأن علامات التبويب أكثر منطقية بالنسبة لي، وأنا أكثر إنتاجية باستخدام علامات التبويب.

أعتقد أن هناك حلًا لكلا:

  1. التوافق مع PEP-8 واستخدام المسافات
  2. سهولة استخدام علامة التبويب بدلاً من 4 مسافات

في برنامج Notepad++، انتقل إلى "التفضيلات"--> "إعدادات علامة التبويب" واختر "Python" من القائمة الموجودة على اليمين.ثم تأكد من "حجم علامة التبويب:4"، وحدد المربع "استبدال [علامة التبويب] بمسافة".في هذه الحالة، يمكنك ببساطة استخدام مفتاح tab لوضع مسافة بادئة، لكن برنامج Notepad++ يقوم بالفعل بتحويل ذلك إلى 4 مسافات لك.

هذا هو بيب 8 اعتبارًا من يوليو 2017:

Enter image description here

ويبدو أن هذا البيان لا يترك مجالاً لأي خيار آخر.

ولكن هذا ليس فقط ما يخبرنا به PEP 8، بعد بضعة أسطر:

Enter image description here

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

لذا:PEP 8 يتحمل المسافة البادئة لعلامة التبويب.ومع ذلك، فهو لا يتحمل خلط علامات التبويب والمسافة للمسافات البادئة، وهو أمر مفهوم، نظرًا لأن المسافة البادئة نفسها إلزامية.

وقد يكون من الجدير بالذكر ذلك أسلوب ترميز جوجل بايثون يتبع أيضًا قاعدة 4-مسافة.

هناك المزيد الحجج والمبررات المختلفة لصالح علامات التبويب أو 4 مسافة.

إذا كنت تعمل في شركة تفرض PEP 8، أو تشارك شفرتك بانتظام مع الآخرين الذين يتبعون PEP 8، فإن الفطرة السليمة هي التي تملي عليك مسافة 4.أنا (ربما كنت) معتادًا على علامات التبويب من C/C++.ولكن مع إعداد IDE بشكل صحيح، يصبح الفرق ضئيلًا.

استخدم المسافات بدلاً من علامات التبويب، لسبب وحيد هو أنك ستجني المزيد من المال :)

المرجع: المطورون الذين يستخدمون المسافات يكسبون أموالاً أكثر من أولئك الذين يستخدمون علامات التبويب (منشور مدونة Stack Overflow).

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

لقد فتحت برنامج Logitech، وقمت بتحديد اثنين من وحدات الماكرو للأزرار الموجودة بجوار زر علامة التبويب مباشرةً، وتم حل المشكلة.

يضيف أحد الزرين أربع مسافات، بينما يضيف الآخر مسافة للخلف أربع مرات.مدهش.فقط رائع.من السهل جدًا الضغط على الأزرار بخنصري أيضًا.

انظر، تحقق من هذا:" "<-- أربع مسافات!بضغطة زر واحدة!إذا كان بإمكاني أن أعرض لك المسافات الخلفية لفعلت ذلك أيضًا.اذهب واحصل على لوحة مفاتيح Logitech G105 وستختفي كل مشاكلك!

لقد بدأت للتو ولكني أجد أن استخدام علامات التبويب أسهل بكثير من استخدام المسافات، ولا أفهم دعوة PEP-8 للمسافات فقط.يقوم Sublime Text 2 بعمل رائع في تصور علامات التبويب باستخدام الخط المنقط العمودي باللون الأبيض الفاتح، وبينما توجد حالات قمت فيها بخلط مسافة أو اثنتين لصف عناصر قائمة أو قاموس، لم أواجه موقفًا قد يؤدي فيه ذلك إلى يكون شيئا ضارا.

أحب علامات التبويب ولكنها غير متوافقة إلى حدٍ ما مع قاعدة أخرى أحبها:الحد الأقصى 80 عمودًا.

إذا اختار أحد الأشخاص 4 علامات تبويب مسافات وأدخل 10 علامات تبويب، فستكون هناك مساحة متبقية تتسع لـ 40 حرفًا للوفاء بالحد الأقصى البالغ 80 عمودًا.إذا فضل مبرمج آخر 8 مسافات، فسيظهر السطر نفسه بطول 120 حرفًا ولن يظهر كسطر صالح مكون من 80 عمودًا!

إذا كنت تريد تحديد حد 80 عمودًا، فيجب عليك اختيار طول لعلامة التبويب.في هذه الحالة، وجود مسافات x أو علامة تبويب بطول x لا يُحدث فرقًا حقًا.

يحرر:الموضوع ذو الصلة: الحفاظ على الحد الأقصى لطول الخط عند استخدام علامات التبويب بدلاً من المسافات؟

أعتقد أن إحدى الفوائد الرئيسية لاستخدام المسافات هي أنك تزيل التباين في كيفية عرض كود المصدر الخاص بك عبر عدد كبير من الأدوات الخارجية التي يجب أن تتفاعل مع المصدر خارج نطاق محرر الاختيار وأي إعدادات قاموا بتكوينها فيها.

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

باختصار، يمكنك تحديد المحاذاة في المصدر بدلاً من البحث عن تكوين موحد لمجموعة الأدوات الموجودة في ترسانتك.يتم تفسير المسافات بشكل صارم في خط أحادي المسافة لتوفير محاذاة موثوقة ومتسقة عبر النطاق الكامل للأدوات نظرًا لتعريف الخط، وليس تنفيذ/تكوين علامة تبويب تابعة لجهة خارجية.

زاوية أخرى لذلك هي نسخ مصدر علامات التبويب البادئة ليتم تشغيله على محطة طرفية حيث يمكن أن يؤدي حرف علامة التبويب إلى إكمال علامة التبويب بشكل غير مقصود.على سبيل المثال، إذا قمت بنسخ مصدر Python التالي (علامات التبويب المستخدمة كمسافة بادئة)،

cmd_create_db = '''CREATE TABLE test (
    Col1 INTEGER,
    Col2 INTEGER,
    Col3 TEXT)'''

قد ترى شيئًا مثل ما يلي (يظهر في المحطة المتكاملة لـ Visual Studio Code) ...

>>> cmd_create_db = '''CREATE TABLE test (
... .DS_StoreCol1 INTEGER,
... .DS_StoreCol2 INTEGER,
... .DS_StoreCol3 TEXT)'''
>>> cmd_create_db
'CREATE TABLE test (\n.DS_StoreCol1 INTEGER,\n.DS_StoreCol2 INTEGER,\n.DS_StoreCol3 TEXT)'

(جانبا:لقد تساءلت عما إذا كانت ملاحظة الاتساق عبر الأدوات هي علامة على العقل التمييزي لمطور ماهر يتطلع إلى تنظيم العالم، مما قد يشير إلى تلميح لفرق الراتب الموجود في Stack Overflow.)

أستخدم مسافات بادئة ومحرر (kwrite) يقوم بإدراج مسافات بدلاً من علامات التبويب عندما أضغط على مفتاح tab.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top