python - आप पायथन में पूर्वप्रक्रमक निर्देशों के बराबर कैसे करेंगे?




preprocessor equivalent (4)

आप पायथन में पूर्वप्रोसेसर का उपयोग कर सकते हैं। बस अपनी स्क्रिप्ट को अपनी बिन निर्देशिका में सीपीपी (सी-प्रीप्रोसेसर) के माध्यम से चलाएं। हालांकि मैंने इसे लुआ के साथ किया है और आसान व्याख्या के लाभ ने अधिक जटिल संकलन आईएमएचओ को आगे बढ़ाया है।

क्या पायथन में निम्नलिखित प्रीप्रोसेसर निर्देश करने का एक तरीका है?

#if DEBUG

< do some code >

#else

< do some other code >

#endif

आप सामान्य भाषा के निर्माण का उपयोग कर सकते हैं:

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 __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: आपके स्रोत से पहले लाइनों की व्याख्या की गई है।


मैंने एक अजगर प्रीप्रोसेसर लिखा था जिसे पीप्रेप्रोसेसर कहा जाता है जो वास्तव में आपके द्वारा वर्णन करता है।

स्रोत और दस्तावेज़ीकरण Google कोड पर उपलब्ध है

पीवाईपीआई के माध्यम से पैकेज भी डाउनलोड / इंस्टॉल किया जा सकता है

आप जो वर्णन कर रहे हैं वह पूरा करने के लिए यहां एक उदाहरण है

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

पीप्रेप्रोसेसर केवल-पर-उड़पूर्व प्रसंस्करण के अलावा बहुत कुछ करने में सक्षम है अधिक उपयोग केस उदाहरणों को देखने के लिए Google Code पर प्रोजेक्ट को देखें।

अद्यतन: पीयरप्रोसेसर के बारे में अधिक जानकारी

जिस तरह से मैं प्रीप्रोसेसिंग पूरा करता हूं वह सरल है उपरोक्त उदाहरण से, प्रीप्रोसेसर एक पीप्रेप्रोसेसर ऑब्जेक्ट आयात करता है जो कि पीप्रेप्रोसेसर मॉड्यूल में बनाया गया है। जब आप पूर्वप्रक्रमक पर पार्स () को कॉल करते हैं, तो यह फ़ाइल को स्व-खपत करती है कि इसे आयात किया जाता है और खुद को एक अस्थायी प्रतिलिपि बनाता है जो सभी पूर्वप्रोसेसर कोड को टिप्पण करता है (पहले प्रक्रमक को अन्तर्निहित लूप में कॉल करने से बचने के लिए) और सभी अप्रयुक्त अंशों को बताता है

लाइनों की टिप्पणी करना, उन्हें हटाने के विरोध में, त्रुटि ट्रेसेबैक पर लाइन नंबर को संरक्षित करने के लिए आवश्यक है यदि मॉड्यूल अपवाद या क्रैश करता है और मैं यहां तक ​​कि जहां तक ​​त्रुटि दर्ज करने के लिए त्रुटि संदेश को फिर से लिखने के लिए चला गया है, उस क्रैश के मॉड्यूल की उचित फ़ाइल नाम प्रतिबिंबित करता है।

फिर, जनरेटेड फ़ाइल जिसमें पोस्टप्रोकैसड कोड होता है, उस पर-मक्खी पर निष्पादित होता है

इस पद्धति का उपयोग करने के लिए इस पद्धति का उपयोग करने के लिए ऊपर उल्लिखित है कि अगर कोड में बयानों का इनलाइन होता है, तो बेकार बयानों का मूल्यांकन करने के लिए कोई निष्पादन समय व्यर्थ नहीं होगा, क्योंकि टिप्पणी की गई भागों को संकलित .पीसी फाइलों से बाहर रखा जाएगा।

डाउनसाइड (और मॉड्यूल बनाने के लिए मेरा मूल कारण) यह है कि आप एक ही फाइल में अजगर 2x और अजगर 3x दोनों को नहीं चला सकते क्योंकि पीयथॉन इंटरप्रीटर कोड निष्पादित करने से पहले पूर्ण सिंटैक्स चेक चलाता है और इससे पहले किसी भी संस्करण विशिष्ट कोड को अस्वीकार कर देगा पूर्वप्रोसेसर को चलाने की अनुमति है :: सांस ::। मेरा मूल लक्ष्य एक ही फाइल में 2x और 3x कोड साइड-बाय-साइड को विकसित करने में सक्षम होना था जो संस्करण विशिष्ट बाइटकोड बनाएगा, जो इस पर चल रहा है पर निर्भर करता है।

किसी भी तरह से, पूर्वप्रोसेसर मॉड्यूल अभी भी आम सी-शैली पूर्वप्रक्रिया क्षमताओं को लागू करने के लिए बहुत उपयोगी है। साथ ही, यदि आप चाहें तो बाद के उपयोग के लिए पूर्वप्रोसेसर पोस्टप्रोसेड कोड को आउटपुट करने में सक्षम है

इसके अलावा, यदि आप ऐसे संस्करण को तैयार करना चाहते हैं जिसमें सभी पूर्वप्रक्रमक निर्देश दिए गए हैं और साथ ही साथ #ifdefs में से कोई भी निकाला गया है, तो इसे पार्स () कॉल करने से पहले पूर्वप्रोग्रासम कोड में ध्वज सेट करने में आसान है। यह संस्करण विशिष्ट स्रोत फ़ाइल से अवांछित कोड को एक एक कदम प्रक्रिया (बनाम कोड के माध्यम से रेंगने और यदि कथन मैन्युअल रूप से निकाल रहा है) को निकाल देता है।





directive