Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

หลาม eval()


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)