eval() วิธีการแยกวิเคราะห์นิพจน์ที่ส่งผ่านไปยังวิธีนี้และรันนิพจน์ภายในโปรแกรม กล่าวอีกนัยหนึ่ง มันตีความสตริงเป็นโค้ดภายในโปรแกรมหลาม
ไวยากรณ์
ไวยากรณ์สำหรับ eval มีดังต่อไปนี้ −
eval(expression, globals=None, locals=None)
ที่ไหน
-
นิพจน์ − เป็นนิพจน์หลามที่ส่งผ่านไปยังเมธอด
-
ทั่วโลก − พจนานุกรมของเมธอดและตัวแปรทั่วโลกที่มีอยู่
-
ชาวบ้าน − พจนานุกรมของวิธีการและตัวแปรในท้องถิ่นที่มีอยู่
ในตัวอย่างด้านล่าง เราอนุญาตให้ผู้ใช้สร้างนิพจน์และเรียกใช้โปรแกรม python เพื่อประเมินนิพจน์นั้น ดังนั้นจึงช่วยในการสร้างไดนามิกโค้ด
ตัวอย่าง
# 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() ให้กับฟังก์ชันหรือตัวแปรบางตัวที่เลือกได้
ขั้นตอนในการป้องกันช่องโหว่เหล่านี้มีดังนี้ -
ละเว้นตัวแปรท้องถิ่นและตัวแปรส่วนกลางในเมธอด eval()
ด้วยวิธีนี้จะได้รับการประเมินเฉพาะในขอบเขตปัจจุบันและไม่พบตัวแปรอื่นนอกขอบเขตนี้
ละเว้นเฉพาะพารามิเตอร์ในเครื่อง
ในการละเว้นตัวแปรโลคัล ตัวแปรทั้งหมดจะถูกกำหนดขอบเขตเป็นตัวแปรส่วนกลาง ต่อไปเราจะส่งต่อพจนานุกรมเปล่าเป็นตัวแปรส่วนกลางและอนุญาตให้เฉพาะตัวแปรบิวท์อินเท่านั้นที่พร้อมใช้งานแม้ว่าเราจะนำเข้าไลบรารีอื่นไปยังโปรแกรมแล้ว
ตัวอย่าง
from time import * print(eval('dir()', {}))<เอาท์พุท>
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
['__builtins__']
ต่อไป เรายังอนุญาตให้เฉพาะบางวิธีจากไลบรารีที่นำเข้ามาใช้กับโปรแกรมได้
from time import * print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))
ผลลัพธ์
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
['Localtime', '__builtins__', 'sleeptime']
ส่งฟังก์ชัน Selective ไปยัง Global และ Local
นอกจากนี้เรายังสามารถจำกัดความพร้อมใช้งานของฟังก์ชันทั้งในขอบเขตท้องถิ่นและระดับโลกโดยไม่อนุญาตให้มีการสร้างในตัวและมีเพียงบางส่วนจากไลบรารีที่นำเข้าในเครื่อง ในตัวอย่างด้านล่าง เราได้จัดทำวิธี 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)