द्वारा पाइथन अभिव्यक्ति मूल्यांकन चरण का पता लगाने के लिए मैं पाइथन अभिव्यक्ति मूल्यांकन विज़ुअलाइज़र लिखने की कोशिश कर रहा हूं, जो दिखाएगा कि पाइथन अभिव्यक्तियों का मूल्यांकन चरण-दर-चरण (शिक्षा उद्देश्यों के लिए) कैसे किया जाता है। फिलिप गुओ का पायथन ट्यूटर बहुत अच्छा है, लेकिन यह लाइन द्वारा पायथन प्रोग्राम लाइन का मूल्यांकन करता है, और मैंने पाया कि छात्रों को कभी-कभी यह समझ में नहीं आता कि sorted([4, 2, 3, 1] + [5, 6])[1] == 2
जैसे एक-पंक्ति अभिव्यक्ति का मूल्यांकन कैसे किया जाता है और मैं इस प्रक्रिया को विज़ुअलाइज़ करना चाहता हूं। (ऐसा लगता है कि कोई भी अभी तक यह किया - कम से कम मैं कुछ नहीं मिला।) आदर्श समाधान इस तरह तार के एक दृश्य पैदा करेगा:चरण
sorted([4, 2, 3, 1] + [5, 6])[1] == 2
sorted(>> [4, 2, 3, 1] + [5, 6] <<)[1] == 2
>> sorted([4, 2, 3, 1, 5, 6]) << [1] == 2
>> [1 2 3 4 5 6][1] << == 2
>> 2 == 2 <<
True
यहाँ >>
और <<
अभिव्यक्ति है कि का एक हिस्सा उजागर करने के लिए उपयोग किया जाता है वर्तमान चरण पर मूल्यांकन किया और फिर इसके मूल्य से बदल दिया। eval(compile(node, '', 'eval'))
साथ यह मूल्यांकन (हो सकता है, मैं बाद में एनीमेशन के कुछ प्रकार के लिए इस क्रम में परिवर्तित करने की कोशिश करेंगे।)
मेरे वर्तमान रणनीति ast.parse()
उपयोग करने के लिए एएसटी में स्ट्रिंग पार्स करने में है, तो एक नोड है कि पहले का मूल्यांकन किया जाएगा लगता है, (मैं निश्चित रूप से पूरे पायथन को पुन: कार्यान्वित नहीं करना चाहता हूं :)), एएसटी नोड में मूल्यांकन के परिणाम को परिवर्तित करें (repr
और फिर ast.parse()
?) और परिणाम नोड के साथ वर्तमान नोड को प्रतिस्थापित करें, फिर संशोधित कोड स्ट्रिंग का उत्पादन करने के लिए codegen.to_source
का उपयोग करें (संशोधित) एएसटी से और उसी प्रक्रिया को जारी रखें जब तक कि मेरे पास पेड़ में केवल एक अक्षर नहीं है।
मेरा प्रश्न है: मैं एक नोड कैसे ढूंढ सकता हूं जिसका मूल्यांकन पहले किया जाएगा? ऐसा लगता है कि मैं वृक्ष गहराई को पार कर सकता हूं- पहले ast.NodeVisitor
उप-वर्ग के साथ, लेकिन मुझे यकीन नहीं है कि मैं कैसे पता लगा सकता हूं कि मैं वांछित नोड तक पहुंचा और इसके बाद मैं ट्रैवर्सिंग कैसे रोक सकता हूं?
संपादित करें।
यह संभव है कि पेड़ के परिवर्तन के साथ मेरा प्रारंभिक दृष्टिकोण संभव नहीं है। वास्तव में, पाइथन अभिव्यक्ति के मूल्यांकन का एक प्रारंभिक कदम कुछ उप-अभिव्यक्ति को एक सरल (जैसे अंकगणित में) के प्रतिस्थापन होना आवश्यक नहीं है। उदाहरण के लिए, सूची की समझ एक और अधिक जटिल व्यवहार प्रदान करती है जिसे शब्दों में व्यक्त नहीं किया जा सकता है, इस बात को उस चीज़ से प्रतिस्थापित करें, फिर रिकर्सिव दोहराएं। तो मैं थोड़ा सवाल फिर से शुरू करता हूं। मुझे प्रोग्रामेटिकल रूप से कुछ तरीके की ज़रूरत है कि कैसे पाइथन अभिव्यक्तियों का मूल्यांकन चरण-दर-चरण किया जाता है। उदाहरण के लिए, मैक्रोपी की tracing सुविधा, जो कि जेसनहरपर द्वारा उल्लिखित है, इस चरण में स्वीकार्य समाधान है। दुर्भाग्यवश, मैक्रोपी को त्याग दिया प्रतीत होता है और पाइथन 3 के साथ काम नहीं करता है। क्या कोई विचार है कि पाइथन 3 में पूर्ण मैक्रोपी पोर्ट किए बिना इस ट्रेसिंग व्यवहार को कैसे दिखाना है?
EDIT2।
इस बक्षीस से सम्मानित होने के बाद, मुझे similar question और debugger बहुत नज़दीकी सुविधाओं के साथ मिला। हालांकि, क्योंकि उस प्रश्न के लिए कोई अंतिम जवाब नहीं है, और मुझे पूर्ण डीबगर की आवश्यकता नहीं है, मैं अभी भी एक ऐसे उत्तर की तलाश कर रहा हूं जिसका उपयोग उदाहरण के लिए जुपीटर पर्यावरण में किया जा सके।
एचएम-एम, 'मैक्रॉपी' [ट्रेसिंग] (https://github.com/lihaoyi/macropy#tracing) बहुत करीब और आशाजनक दिखता है, धन्यवाद। मुझे इसमें खोदना होगा। –
हां, 'मैक्रोपी' पायथन 3 :( –