สิ่งที่คุณต้องรู้เกี่ยวกับ Eval ใน Python



บทความนี้จะให้ความรู้ที่ละเอียดและครอบคลุมเกี่ยวกับ Eval ใน Python ซึ่งเป็นข้อเสียและใช้กับตัวอย่าง

ทุกที่ที่คุณมองไปรอบ ๆ คุณจะพบกับแอปพลิเคชันที่สร้างขึ้นโดยเฉพาะเพื่อตอบสนองความต้องการของคุณ แม้ว่าจะมีภาษาโปรแกรมมากมายที่สามารถใช้ในการพัฒนาแอปพลิเคชันเหล่านี้ได้ แต่ส่วนใหญ่สร้างขึ้นโดยใช้ . Python พร้อมด้วยคุณสมบัติที่ยอดเยี่ยมและความเก่งกาจที่เพิ่มขึ้นนำมาสู่ข้อเสนอพิเศษเฉพาะของตารางซึ่งมีทั้งทรงพลังและมีประโยชน์อย่างยิ่งตลอดเวลา ในบทความ Eval ใน Python นี้เราจะพูดถึงประเด็นต่อไปนี้:

Eval ใน Python คืออะไร?

ฟังก์ชัน eval ใน Python เป็นหนึ่งในตัวเลือกที่น่าสนใจที่สุด บางคนเรียกมันว่าแฮ็คและบางคนเรียกมันว่าทางลัด แต่ไม่ว่าคุณจะใช้มันด้วยวิธีใดก็คือเรียกใช้โปรแกรม Python ภายในรหัส Python สวยเท่ใช่มั้ย?





เมื่อคุณใช้ฟังก์ชัน eval โดยทั่วไปคุณจะเรียกร้องให้ล่ามเรียกใช้ที่อยู่ในวงเล็บของฟังก์ชัน eval

PythonLogo- Eval ใน Pythonไวยากรณ์สำหรับการใช้ฟังก์ชัน eval ใน Python คือ:



eval (นิพจน์, globals = ไม่มี, ชาวบ้าน = ไม่มี)

ในไวยากรณ์ข้างต้น

  1. นิพจน์: เป็นสตริงหรือส่วนของรหัสที่แยกวิเคราะห์และประเมินเป็นนิพจน์ Python ภายในโปรแกรม Python เอง



  2. ทั่วโลก: เป็นพจนานุกรมที่ใช้เพื่อกำหนดวิธีการทั่วโลกทั้งหมดที่มีในการดำเนินการตามนิพจน์ที่กล่าวถึงข้างต้น นี่เป็นเอนทิตีทางเลือกและการใช้งานขึ้นอยู่กับความต้องการของคุณ

  3. ชาวบ้าน: เช่นเดียวกับ globals นี่คือพจนานุกรมอื่นที่ใช้เพื่อระบุวิธีการท้องถิ่นที่มีอยู่รวมทั้งตัวแปร

    ความแตกต่างระหว่าง pass by value และ pass by reference ใน java

เพื่อให้เข้าใจการใช้งานฟังก์ชันนี้ได้ดียิ่งขึ้นโปรดดูตัวอย่างด้านล่าง

จากการนำเข้าทางคณิตศาสตร์ * def secret_function (): return 'Secret key is 1234' def function_creator (): # expression to be evaluated expr = raw_input ('Enter the function (in terms of x):') # variable used in expression x = int (raw_input ('ป้อนค่าของ x:')) # การประเมินนิพจน์ y = eval (expr) # การพิมพ์ผลลัพธ์ที่ได้รับการประเมินการพิมพ์ ('y = {}'. format (y)) ถ้า __name__ == '__main__': function_creator ()

ในตัวอย่างข้างต้น function_creator เป็นฟังก์ชันที่จะประเมินนิพจน์ทางคณิตศาสตร์ที่ผู้ใช้สร้างขึ้นเมื่อโปรแกรมทำงาน

เอาท์พุต:

ป้อนฟังก์ชัน (ในรูปของ x): x * (x + 1) * (x + 2)

ป้อนค่า x: 3

y = 60

การวิเคราะห์

เมื่อคุณได้ดูโค้ดที่แบ่งปันด้านบนแล้วให้เราวิเคราะห์เพิ่มเติมอีกเล็กน้อย

  1. ฟังก์ชันข้างต้นจะรับตัวแปรใด ๆ ในนิพจน์ x เป็นอินพุต

  2. เมื่อดำเนินการแล้วผู้ใช้จะได้รับแจ้งให้ป้อนค่าสำหรับ x หลังจากนั้นจะส่งผลให้โปรแกรมถูกสร้างขึ้น

  3. สุดท้ายโปรแกรม Python จะเรียกใช้ฟังก์ชัน eval โดยการแยกวิเคราะห์ไฟล์exprเป็นข้อโต้แย้ง

ข้อเสียของ Eval

เช่นเดียวกับฟังก์ชันในตัวอื่น ๆ ของ Python eval ก็มาพร้อมกับข้อเสียเล็กน้อยที่อาจสร้างปัญหาหากไม่ได้รับการพิจารณา

หากคุณดูตัวอย่างข้างต้นหนึ่งในช่องโหว่หลักของฟังก์ชัน function_creator คือมันสามารถเปิดเผยค่าใด ๆ ที่ซ่อนอยู่ภายในโปรแกรมและยังเรียกใช้ฟังก์ชันที่เป็นอันตรายด้วยโดยค่าเริ่มต้นจะดำเนินการทุกอย่างที่อยู่ในวงเล็บ

หากต้องการทำความเข้าใจเพิ่มเติมโปรดดูตัวอย่างด้านล่าง

ข้อมูลจากผู้ใช้

ป้อนฟังก์ชัน (ในรูปของ x): secret_function ()

ป้อนค่า x: 0

เอาท์พุต:

y = รหัสลับคือ 1234

สถานการณ์อันตรายอีกอย่างที่มาพร้อมกับการใช้ฟังก์ชัน eval คือการนำเข้าโมดูลระบบปฏิบัติการ เมื่อคุณนำเข้าโมดูลระบบปฏิบัติการจะอนุญาตให้ Python อ่านและเขียนไฟล์ใด ๆ ที่มีอยู่ในระบบดั้งเดิมของคุณโดยไม่ต้องมีการพิสูจน์ตัวตนจากผู้ใช้ ในกรณีนี้หากคุณพิมพ์ไฟล์บรรทัดโค้ดไฟล์เนทีฟทั้งหมดของคุณอาจถูกลบ

วิธีแก้ข้อบกพร่องทั้งหมดนี้อยู่ที่การ จำกัด ความสามารถของฟังก์ชัน eval

ทำให้ Eval ปลอดภัยใน Python

โดยค่าเริ่มต้น Eval มาพร้อมกับตัวเลือกในการแยกวิเคราะห์ฟังก์ชันใด ๆ ที่มีการเข้าถึงหรือที่ได้กำหนดไว้แล้ว คำนึงถึงสิ่งนี้ในขณะที่เขียนโค้ดของคุณจะจำกัดความสามารถในการ eval ให้อยู่ในระดับมากดังนั้นคุณจึงมั่นใจได้ว่าไม่มีอะไรผิดพลาด

หากต้องการทำความเข้าใจแนวคิดนี้เพิ่มเติมโปรดดูตัวอย่างด้านล่าง

จากการนำเข้าทางคณิตศาสตร์ * def secret_function (): return 'Secret key is 1234' def function_creator (): # expression to be evaluated expr = raw_input ('Enter the function (in terms of x):') # variable used in expression x = int (raw_input ('ป้อนค่า x:')) # ผ่านตัวแปร x ในเซฟพจนานุกรม safe_dict ['x'] = x # กำลังประเมินนิพจน์ y = eval (expr, {'__builtins __': ไม่มี}, safe_dict) # การพิมพ์ พิมพ์ผลลัพธ์ที่ได้รับการประเมิน ('y = {}'. format (y)) if __name__ == '__main__': # รายการวิธีการที่ปลอดภัย safe_list = ['acos', 'asin', 'atan', 'atan2', 'ceil ',' cos ',' cosh ',' degrees ',' e ',' exp ',' fabs ',' floor ',' fmod ',' frexp ',' hypot ',' ldexp ',' log ', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh'] # การสร้างพจนานุกรมวิธีการที่ปลอดภัย safe_dict = dict ([(k, local (). get (k, None)) สำหรับ k ใน safe_list]) function_creator ()

ข้อมูลจากผู้ใช้

c ++ วิธีใช้เนมสเปซ

ป้อนฟังก์ชัน (ในรูปของ x): secret_function ()

ป้อนค่า x: 0

เอาท์พุต:

NameError: ไม่ได้กำหนดชื่อ 'secret_function'

ดังที่คุณเห็นได้จากการ จำกัด การเข้าถึง eval โอกาสที่ผลลัพธ์ที่ไม่ถูกต้องซึ่งสามารถพิสูจน์ได้ว่าเป็นอันตรายจะถูกลบล้างไป

การใช้ Eval

ตามที่อธิบายไว้ในส่วนข้างต้นเนื่องจากเหตุผลด้านความปลอดภัยหลายประการจึงไม่นิยมใช้การประเมิน แต่ถึงกระนั้นก็มีกรณีการใช้งานโดยเฉพาะที่การใช้ eval พิสูจน์ว่ามีประโยชน์ สิ่งที่สำคัญที่สุดบางประการ ได้แก่

  1. หากคุณต้องการให้ผู้ใช้ป้อน scriptlets ของตนเองเพื่อแก้ไขผลลัพธ์ของโปรแกรมการใช้ฟังก์ชัน eval จะพิสูจน์ได้ว่ามีประโยชน์

  2. ในขณะที่เขียนนิพจน์เพื่อแก้ปัญหาการสืบค้นทางคณิตศาสตร์คุณสามารถใช้ eval ได้เนื่องจากง่ายกว่าการเขียนตัวแยกนิพจน์

ตอนนี้คุณรู้ทุกอย่างเกี่ยวกับ eval แล้วเราหวังว่าคุณจะใช้ประโยชน์จากสิ่งเดียวกันในการเขียนโปรแกรมแบบวันต่อวันโดยคำนึงถึงข้อดีและข้อเสีย

ด้วยเหตุนี้เราจึงมาถึงตอนท้ายของบทความ Eval ใน Python หากต้องการรับความรู้เชิงลึกเกี่ยวกับ Python พร้อมกับแอพพลิเคชั่นต่างๆคุณสามารถทำได้ สำหรับการฝึกอบรมออนไลน์สดพร้อมการสนับสนุนตลอด 24 ชั่วโมงทุกวันและการเข้าถึงตลอดชีวิต

มีคำถามสำหรับเรา? พูดถึงพวกเขาในส่วนความคิดเห็นของ“ Eval ใน Python” แล้วเราจะติดต่อกลับไป