मुझे फ़ंक्शन के रूप में इनपुट स्ट्रिंग (डेटाबेस से) को संकलित करने और इसे चलाने की आवश्यकता है।एएसटी का उपयोग कर फ़ंक्शन के रूप में टेक्स्ट को संकलित कैसे करें?
कहो मैं पहले से ही इस समारोह को परिभाषित किया है:: यह विधि मैं वर्तमान में उपयोग करें
def foo():
print "Yo foo! I am a function!"
और स्ट्रिंग मैं डेटाबेस से में पढ़ा है कि मैं इस समारोह फोन करना चाहिए कहते हैं:
string_from_db = "foo()"
मैं फिर एक फ़ंक्शन (जिसका नाम मैं नियंत्रित कर सकता हूं) बनाता हूं जो डेटाबेस से पढ़े गए फ़ंक्शन को लौटाता है:
my_func_string = "def doTheFunc():\n\t return " + string_from_db
अब मैं स्ट्रिंग संकलन, और एक समारोह का नाम मैं प्रसंस्करण के लिए बाद में उपयोग करने के लिए यह सेट: Yo foo! I am a function!
मेरे प्रश्न:: ऊपर
exec my_func_string
processor = doTheFunc
मैं इसे कॉल कर सकते हैं बाद में processor()
चल रहा है जो का दावा द्वारा "। संभावित प्रतिस्थापन"
###############################################################
# The following method for getting a function out of the text #
# in the database could potentially be replaced by using #
# Python's ast module to obtain an abstract syntax tree and #
# put it inside of a function node #
###############################################################
मैं इस बारे में अधिक जानना चाहते हैं: कोड के इस टुकड़े वहाँ एक टिप्पणी (एक लंबे खो डेवलपर द्वारा छोड़कर चला गया) मैंने एएसटी पर एक नज़र डाली है, लेकिन मैं इस बात पर बहुत उलझन में हूं कि यह मेरी मदद कैसे कर सकता है जो मैं ऊपर दिए गए कोड के साथ कर रहा हूं।
- एएसटी का उपयोग करके मैं वही चीज़ कैसे पूरा कर सकता हूं? या इस प्रक्रिया में एएसटी मेरी मदद कर सकता है?
- एएसटी का उपयोग करके कार्यान्वयन बेहतर है, और क्यों?
आप अंधेरे जादू के क्षेत्र में रहें। –
यदि आप स्ट्रिंग को सुरक्षित रखने के बारे में जानते हैं, तो 'exec' 'exec()' पर' ast' का उपयोग करने का कोई कारण नहीं है। पायथन दुभाषिया पहले से ही कार्य पदार्थों में पाइथन स्रोत कोड पार्सिंग लागू करता है, इसे दोहराना क्यों? – millimoose
@ मिलिमुओस मैं 'निष्पादन' कार्यान्वयन के साथ जा रहा हूं, क्योंकि मुझे पता है कि मेरे तार सुरक्षित हैं। हालांकि, इस सवाल ने मुझे 'अस्थिर' के लिए बेहतर उपयोगों पर प्रकाश डाला है। धन्यवाद! – dinkelk