eval() মেথড এই পদ্ধতিতে দেওয়া এক্সপ্রেশনকে পার্স করে এবং প্রোগ্রামের মধ্যে এক্সপ্রেশন চালায়। অন্য কথায়, এটি একটি স্ট্রিংকে একটি পাইথন প্রোগ্রামের ভিতরে কোড হিসাবে ব্যাখ্যা করে।
সিনট্যাক্স
eval-এর জন্য সিনট্যাক্স নিম্নরূপ -
eval(expression, globals=None, locals=None)
কোথায়
-
অভিব্যক্তি − এটি পদ্ধতিতে পাস করা পাইথন এক্সপ্রেশন।
-
গ্লোবাল − উপলব্ধ বিশ্বব্যাপী পদ্ধতি এবং ভেরিয়েবলের একটি অভিধান।
-
স্থানীয়রা - উপলব্ধ স্থানীয় পদ্ধতি এবং ভেরিয়েবলের একটি অভিধান।
নীচের উদাহরণে আমরা ব্যবহারকারীকে একটি অভিব্যক্তি তৈরি করতে এবং সেই অভিব্যক্তিটি মূল্যায়ন করার জন্য একটি পাইথন প্রোগ্রাম চালানোর অনুমতি দিই। তাই এটি গতিশীল কোড তৈরি করতে সাহায্য করে।
উদাহরণ
# expression to be evaluated user_expr = raw_input("Enter an expression in terms of variable a):") #nter the value of variable a = int(raw_input("Enter the value of a:")) # evaluate the expression result = eval(user_expr) # printing evaluated result print("Result = {}".format(result))
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
Enter an expression in terms of variable a):a*(a-3)+a^2 Enter the value of a:7 Result = 33
ইভালের সাথে নিরাপত্তা সমস্যা()
ওয়েব অ্যাপ্লিকেশন বা ডেস্কটপ প্রোগ্রামের সাথে জড়িত প্রোগ্রামগুলির জন্য এমন একটি সুযোগ রয়েছে যে এই ধরনের eval() পদ্ধতির ব্যবহার নিরাপত্তা দুর্বলতা তৈরি করবে কারণ প্রোগ্রামটি চালানোর ফলে এক্সপ্রেশনগুলি সরবরাহ করতে পারে যা ফাইলগুলি মুছে ফেলার বা সিস্টেম থেকে সংবেদনশীল ডেটা বের করার জন্য সিস্টেম কমান্ড। এটি প্রতিরোধ করার পদক্ষেপ হিসাবে আমরা eval() ফাংশনকে কিছু নির্বাচিত ফাংশন বা ভেরিয়েবলের মধ্যে সীমাবদ্ধ করতে পারি।
এই দুর্বলতাগুলি প্রতিরোধ করার পদক্ষেপগুলি নিম্নরূপ -
eval() পদ্ধতিতে স্থানীয় এবং বিশ্বব্যাপী উভয় ভেরিয়েবল বাদ দিন।
এইভাবে এটি শুধুমাত্র বর্তমান সুযোগে মূল্যায়ন করা হবে এবং এই সুযোগের বাইরে অন্য ভেরিয়েবল খুঁজে পাবে না।
কেবল স্থানীয় পরামিতি বাদ দিন
স্থানীয় ভেরিয়েবল বাদ দিলে, সমস্ত ভেরিয়েবলকে গ্লোবাল ভেরিয়েবল হিসেবে স্কোপ করা হয়। এরপরে আমরা একটি খালি অভিধানকে গ্লোবাল ভেরিয়েবল হিসাবে পাস করি এবং এটি শুধুমাত্র বিল্ট-ইন ভেরিয়েবলগুলিকে উপলব্ধ করার অনুমতি দেয় এমনকি যখন আমরা প্রোগ্রামে অন্যান্য লাইব্রেরি আমদানি করে থাকি।
উদাহরণ
from time import * print(eval('dir()', {}))<আউটপুট>
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
['__builtins__']
পরবর্তীতে আমরা ইম্পোর্ট করা লাইব্রেরি থেকে শুধুমাত্র কিছু পদ্ধতিকে প্রোগ্রামে উপলব্ধ করার অনুমতি দিতে পারি।
from time import * print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
['Localtime', '__builtins__', 'sleeptime']
গ্লোবাল এবং স্থানীয় উভয় ক্ষেত্রেই নির্বাচনী ফাংশন পাস করা
আমরা স্থানীয় এবং বৈশ্বিক উভয় ক্ষেত্রেই ফাংশনের প্রাপ্যতাকে সীমাবদ্ধ করতে পারি বিল্ট ইনগুলির কোনওটিকেই অনুমতি না দিয়ে এবং স্থানীয়ভাবে আমদানি করা লাইব্রেরি থেকে কয়েকটিকে। নীচের উদাহরণে আমরা টাইম লাইব্রেরি থেকে শুধুমাত্র gmtime পদ্ধতিটি উপলব্ধ করেছি।
উদাহরণ
from time import * a = 1445945763 print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)আউটপুট>