कोड संरचना को पार्स करना और संशोधित करना निश्चित रूप से ast
मॉड्यूल की मदद से संभव है और मैं इसे एक क्षण में एक उदाहरण में दिखाऊंगा। हालांकि, संशोधित स्रोत कोड को वापस लिखना ast
अकेले मॉड्यूल के साथ संभव नहीं है । इस काम के लिए अन्य मॉड्यूल उपलब्ध हैं जैसे कि यहां एक ।
नोट: नीचे दिए गए उदाहरण को ast
मॉड्यूल के उपयोग पर एक परिचयात्मक ट्यूटोरियल के रूप में माना जा सकता है, लेकिन ast
मॉड्यूल का उपयोग करने पर अधिक व्यापक मार्गदर्शिका यहां ग्रीन ट्री सांप ट्यूटोरियल और मॉड्यूल पर आधिकारिक प्रलेखन में उपलब्ध ast
है ।
का परिचय ast
:
>>> import ast
>>> tree = ast.parse("print 'Hello Python!!'")
>>> exec(compile(tree, filename="<ast>", mode="exec"))
Hello Python!!
आप केवल एपीआई को कॉल करके अजगर कोड (स्ट्रिंग में दर्शाए गए) को पार्स कर सकते हैं ast.parse()
। यह सार सिंटैक्स ट्री (एएसटी) संरचना को संभालता है। दिलचस्प है कि आप इस संरचना को वापस संकलित कर सकते हैं और इसे ऊपर बताए अनुसार निष्पादित कर सकते हैं।
एक और बहुत उपयोगी एपीआई है ast.dump()
जो पूरे एएसटी को एक स्ट्रिंग रूप में डंप करता है। इसका उपयोग पेड़ की संरचना का निरीक्षण करने के लिए किया जा सकता है और यह डिबगिंग में बहुत सहायक है। उदाहरण के लिए,
पायथन 2.7 पर:
>>> import ast
>>> tree = ast.parse("print 'Hello Python!!'")
>>> ast.dump(tree)
"Module(body=[Print(dest=None, values=[Str(s='Hello Python!!')], nl=True)])"
पायथन 3.5 पर:
>>> import ast
>>> tree = ast.parse("print ('Hello Python!!')")
>>> ast.dump(tree)
"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='Hello Python!!')], keywords=[]))])"
पायथन 2.7 बनाम पायथन 3.5 में प्रिंट स्टेटमेंट के लिए वाक्यविन्यास में अंतर और संबंधित पेड़ों में एएसटी नोड के प्रकार में अंतर को नोटिस करें।
कोड का उपयोग करके संशोधन कैसे करें ast
:
अब, आइए ast
मॉड्यूल द्वारा अजगर कोड के संशोधन के उदाहरण पर एक नज़र डालते हैं । एएसटी संरचना को संशोधित करने का मुख्य उपकरण ast.NodeTransformer
वर्ग है। जब भी किसी को एएसटी को संशोधित करने की आवश्यकता होती है, तो उसे इससे उप-विभाजन करने की आवश्यकता होती है और तदनुसार नोड ट्रांसफॉर्मेशन लिखना होता है।
हमारे उदाहरण के लिए, आइए एक साधारण उपयोगिता लिखने का प्रयास करें जो पायथन 2 को रूपांतरित करता है, पायथन 3 फ़ंक्शन कॉल को स्टेटमेंट प्रिंट करता है।
फ़न कॉल कनवर्टर उपयोगिता के लिए प्रिंट स्टेटमेंट: Print2to3.py:
#!/usr/bin/env python
'''
This utility converts the python (2.7) statements to Python 3 alike function calls before running the code.
USAGE:
python print2to3.py <filename>
'''
import ast
import sys
class P2to3(ast.NodeTransformer):
def visit_Print(self, node):
new_node = ast.Expr(value=ast.Call(func=ast.Name(id='print', ctx=ast.Load()),
args=node.values,
keywords=[], starargs=None, kwargs=None))
ast.copy_location(new_node, node)
return new_node
def main(filename=None):
if not filename:
return
with open(filename, 'r') as fp:
data = fp.readlines()
data = ''.join(data)
tree = ast.parse(data)
print "Converting python 2 print statements to Python 3 function calls"
print "-" * 35
P2to3().visit(tree)
ast.fix_missing_locations(tree)
# print ast.dump(tree)
exec(compile(tree, filename="p23", mode="exec"))
if __name__ == '__main__':
if len(sys.argv) <=1:
print ("\nUSAGE:\n\t print2to3.py <filename>")
sys.exit(1)
else:
main(sys.argv[1])
इस उपयोगिता को छोटे उदाहरण फ़ाइल पर आज़माया जा सकता है, जैसे नीचे एक, और इसे ठीक काम करना चाहिए।
इनपुट फ़ाइल का परीक्षण करें: py2.py
class A(object):
def __init__(self):
pass
def good():
print "I am good"
main = good
if __name__ == '__main__':
print "I am in main"
main()
कृपया ध्यान दें कि उपरोक्त परिवर्तन केवल ast
ट्यूटोरियल उद्देश्य के लिए है और वास्तविक स्थिति में सभी को अलग-अलग परिदृश्यों जैसे कि देखना होगा print " x is %s" % ("Hello Python")
।