ทุกที่ที่คุณมองไปรอบ ๆ คุณจะพบกับแอปพลิเคชันที่สร้างขึ้นโดยเฉพาะเพื่อตอบสนองความต้องการของคุณ แม้ว่าจะมีภาษาโปรแกรมมากมายที่สามารถใช้ในการพัฒนาแอปพลิเคชันเหล่านี้ได้ แต่ส่วนใหญ่สร้างขึ้นโดยใช้ . Python พร้อมด้วยคุณสมบัติที่ยอดเยี่ยมและความเก่งกาจที่เพิ่มขึ้นนำมาสู่ข้อเสนอพิเศษเฉพาะของตารางซึ่งมีทั้งทรงพลังและมีประโยชน์อย่างยิ่งตลอดเวลา ในบทความ Eval ใน Python นี้เราจะพูดถึงประเด็นต่อไปนี้:
Eval ใน Python คืออะไร?
ฟังก์ชัน eval ใน Python เป็นหนึ่งในตัวเลือกที่น่าสนใจที่สุด บางคนเรียกมันว่าแฮ็คและบางคนเรียกมันว่าทางลัด แต่ไม่ว่าคุณจะใช้มันด้วยวิธีใดก็คือเรียกใช้โปรแกรม Python ภายในรหัส Python สวยเท่ใช่มั้ย?
เมื่อคุณใช้ฟังก์ชัน eval โดยทั่วไปคุณจะเรียกร้องให้ล่ามเรียกใช้ที่อยู่ในวงเล็บของฟังก์ชัน eval
ไวยากรณ์สำหรับการใช้ฟังก์ชัน eval ใน Python คือ:
eval (นิพจน์, globals = ไม่มี, ชาวบ้าน = ไม่มี)
ในไวยากรณ์ข้างต้น
นิพจน์: เป็นสตริงหรือส่วนของรหัสที่แยกวิเคราะห์และประเมินเป็นนิพจน์ Python ภายในโปรแกรม Python เอง
ทั่วโลก: เป็นพจนานุกรมที่ใช้เพื่อกำหนดวิธีการทั่วโลกทั้งหมดที่มีในการดำเนินการตามนิพจน์ที่กล่าวถึงข้างต้น นี่เป็นเอนทิตีทางเลือกและการใช้งานขึ้นอยู่กับความต้องการของคุณ
ชาวบ้าน: เช่นเดียวกับ 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
การวิเคราะห์
เมื่อคุณได้ดูโค้ดที่แบ่งปันด้านบนแล้วให้เราวิเคราะห์เพิ่มเติมอีกเล็กน้อย
ฟังก์ชันข้างต้นจะรับตัวแปรใด ๆ ในนิพจน์ x เป็นอินพุต
เมื่อดำเนินการแล้วผู้ใช้จะได้รับแจ้งให้ป้อนค่าสำหรับ x หลังจากนั้นจะส่งผลให้โปรแกรมถูกสร้างขึ้น
สุดท้ายโปรแกรม 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 พิสูจน์ว่ามีประโยชน์ สิ่งที่สำคัญที่สุดบางประการ ได้แก่
หากคุณต้องการให้ผู้ใช้ป้อน scriptlets ของตนเองเพื่อแก้ไขผลลัพธ์ของโปรแกรมการใช้ฟังก์ชัน eval จะพิสูจน์ได้ว่ามีประโยชน์
ในขณะที่เขียนนิพจน์เพื่อแก้ปัญหาการสืบค้นทางคณิตศาสตร์คุณสามารถใช้ eval ได้เนื่องจากง่ายกว่าการเขียนตัวแยกนิพจน์
ตอนนี้คุณรู้ทุกอย่างเกี่ยวกับ eval แล้วเราหวังว่าคุณจะใช้ประโยชน์จากสิ่งเดียวกันในการเขียนโปรแกรมแบบวันต่อวันโดยคำนึงถึงข้อดีและข้อเสีย
ด้วยเหตุนี้เราจึงมาถึงตอนท้ายของบทความ Eval ใน Python หากต้องการรับความรู้เชิงลึกเกี่ยวกับ Python พร้อมกับแอพพลิเคชั่นต่างๆคุณสามารถทำได้ สำหรับการฝึกอบรมออนไลน์สดพร้อมการสนับสนุนตลอด 24 ชั่วโมงทุกวันและการเข้าถึงตลอดชีวิต
มีคำถามสำหรับเรา? พูดถึงพวกเขาในส่วนความคิดเห็นของ“ Eval ใน Python” แล้วเราจะติดต่อกลับไป