كيف يمكنك أن تفعل ما يعادل توجيهات المعالج في الثعبان ؟

StackOverflow https://stackoverflow.com/questions/482014

سؤال

هل هناك طريقة للقيام بما يلي توجيهات المعالج في الثعبان ؟

#if DEBUG

< do some code >

#else

< do some other code >

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

المحلول

وهناك __debug__، الذي هو قيمة خاصة أن المترجم لا المعالجة المسبقة.

if __debug__:
  print "If this prints, you're not running python -O."
else:
  print "If this prints, you are running python -O!"
سيتم استبدال

و__debug__ مع ثابت 0 أو 1 قبل المجمع، وسوف محسن إزالة أي خطوط if 0: قبل يفسر المصدر.

نصائح أخرى

كتبت الثعبان المعالج يسمى pypreprocessor أن يفعل بالضبط ما كنت تصف.

المصدر والوثائق متاحة على جيثب.

الحزمة يمكن أيضا تحميل/تثبيت من خلال PyPI.

هنا مثال لإنجاز ما كنت تصف.

from pypreprocessor import pypreprocessor

pypreprocessor.parse()

#define debug

#ifdef debug
print('The source is in debug mode')
#else
print('The source is not in debug mode')
#endif

pypreprocessor قادر على الكثير أكثر من مجرد on-the-fly تجهيزها.لرؤية المزيد من استخدام الأمثلة تحقق من المشروع على مدونة جوجل.

تحديث:مزيد من المعلومات على pypreprocessor

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

التعليق الخروج الأسطر هو, بدلا من إزالتها ، هو ضروري للحفاظ على خط الأعداد على خطأ tracebacks إذا وحدة يطرح استثناء أو تعطل.و حتى لقد ذهب إلى حد كتابة الخطأ traceback أن التقرير تعكس السليم الملف اسم الوحدة النمطية التي تحطمت.

ثم إنشاء ملف يحتوي على postprocessed يتم تنفيذ التعليمات البرمجية على ذبابة.

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

الجانب السلبي (و بلدي الأصلي سبب إنشاء وحدة) هو أنه لا يمكنك تشغيل كل الثعبان 2x و الثعبان 3x في نفس الملف لأن الثعابين مترجم يعمل كامل الجملة تحقق قبل تنفيذ الكود و سوف نرفض أي نسخة كود معين قبل المعالج يسمح لتشغيل ::تنهد::.بلدي الأصلي كان الهدف أن تكون قادرة على تطوير 2x 3x رمز جنبا إلى جنب في نفس الملف الذي من شأنه أن يخلق نسخة محددة بايت كود اعتمادا على ما يعمل على.

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

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

وأظن أنك ستعمل الكراهية هذه الإجابة. الطريقة يمكنك أن تفعل ذلك في بيثون هو

# code here
if DEBUG:
   #debugging code goes here
else:
   # other code here.

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

ويمكنك استخدام المعالج في بيثون. فقط تشغيل البرامج النصية من خلال حزب الشعب الكمبودي (C-قبل المعالج) في دليل بن لديك. ومع ذلك لقد فعلت هذا مع لوا وفوائد من السهل تفسير وتفوق IMHO تجميع أكثر تعقيدا.

ويمكنك فقط استخدام بنيات اللغة العادية:

DEBUG = True
if DEBUG:
  # Define a function, a class or do some crazy stuff
  def f():
    return 23
else:
  def f():
    return 42

وهناك طريقة بديلة لاستخدام برنامج نصي باش التعليق الخروج أجزاء من التعليمات البرمجية التي هي ذات الصلة فقط لتصحيح الأخطاء. فيما يلي مثال السيناريو الذي يعلق خارج الخطوط التي لديه بيان "#DEBUG 'فيه. ويمكن أيضا إزالة هذه العلامات تعليق مرة أخرى.

if [ "$1" == "off" ]; then
  sed -e '/^#/! {/#DEBUG/ s/^/#/}' -i *.py
  echo "Debug mode to $1"
elif [ "$1" == "on" ]; then
  sed -e '/#DEBUG/ s/^#//' -i *.py
  echo "Debug mode to $1"
else
  echo "usage: $0 on | off"
fi
  • الثعبان إذا لا يمكن القضاء على عناصر من المصفوفات.
  • ج precompilers لا تتعامل مع #!أو خطوط أخرى بدءا # حسب الحاجة.
  • pypreprocessor يبدو أن الثعبان محددة

استخدام مشترك m4 بدلا من ذلك, مثل هذا:

ifelse(DEBUG,True,dnl`
  < do some code >
dnl,dnl`
  < do some other code >dnl
')

ifelse(
  M4_CPU,x86_64,`
    < do some code specific for M4_CPU >
',M4_CPU,arm,`
    < do some code specific for M4_CPU >
',M4_CPU,ppc64le,`
    < do some code specific for M4_CPU >
')

ifelse(
  M4_OS,windows,`
    < do some code specific for M4_OS >
  ',M4_OS,linux,`
    < do some code specific for M4_OS >
  ',M4_OS,android,`
    < do some code specific for M4_OS >
')

m4 -د DEBUG=True -د M4_OS=الروبوت -د M4_CPU=اختبار الذراع.py.m4 > test.py

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