কোড কাঠামো বিশ্লেষণ এবং সংশোধন করা অবশ্যই 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()
যা পুরো এএসটিটিকে স্ট্রিং আকারে ফেলে দেয়। এটি গাছের কাঠামোটি পরিদর্শন করতে ব্যবহার করা যেতে পারে এবং এটি ডিবাগিংয়ে খুব সহায়ক। উদাহরণ স্বরূপ,
পাইথন ২.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=[]))])"
পাইথন ২.7 বনাম পাইথন ৩.৫ এর প্রিন্ট স্টেটমেন্টের বাক্য গঠনের পার্থক্য এবং স্ব স্ব গাছগুলিতে এএসটি নোডের পার্থক্য লক্ষ্য করুন।
কীভাবে কোডটি সংশোধন করবেন ast
:
এখন, ast
মডিউল দ্বারা পাইথন কোড পরিবর্তন করার উদাহরণ দেখুন at এএসটি কাঠামো সংশোধন করার প্রধান সরঞ্জামটি 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")
।