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

exec() ใน Python


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

ไวยากรณ์สำหรับฟังก์ชัน exec()

exec(object, globals, locals)

ที่ไหน

  • วัตถุ − สตริงหรืออ็อบเจ็กต์โค้ดที่ส่งผ่านไปยังเมธอด

  • ทั่วโลก − พจนานุกรมของเมธอดและตัวแปรทั่วโลกที่มีอยู่

  • ชาวบ้าน − พจนานุกรมของวิธีการและตัวแปรในท้องถิ่นที่มีอยู่

ส่งสตริง

ในตัวอย่างด้านล่าง เราส่งโค้ดบรรทัดเดียวเป็นสตริงไปยังฟังก์ชัน exec() Itr ได้รับการแยกวิเคราะห์และดำเนินการเพื่อให้ผลลัพธ์

x = 9
exec ('print(5*x)')

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

45

ส่งรหัสวัตถุ

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

ตัวอย่าง

prog_block = 'x = 3 \nif(x < 5): \n print x*x'
exec(prog_block)

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

9

ไม่มีพารามิเตอร์ส่วนกลางและในเครื่อง

เมื่อเราไม่ส่งค่าใด ๆ สำหรับพารามิเตอร์โกลบอลและโลคัล เราจะได้รับฟังก์ชันเริ่มต้นที่พร้อมใช้งานตามแพ็กเกจที่นำเข้ามาในโปรแกรม ในตัวอย่างด้านล่าง เราจะเห็นโค้ดที่ให้ฟังก์ชันที่พร้อมใช้งานทั้งหมดเมื่อข้ามค่าพารามิเตอร์ทั้งส่วนกลางและในเครื่อง

from time import *
exec("print(dir())")

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', 
'__package__', '_dh', '_exit_code', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15',
 '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'clock', 
'copysign', 'cos', 'cosh', 'ctime', 'daylight', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 
'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'get_ipython', 'gmtime', 'hypot', 
'isinf', 'isnan', 'ldexp', 'lgamma', 'localtime', 'log', 'log10', 'log1p', 'mktime', 'modf', 'pi', 
'pow', 'prog', 'prog_block', 'quit', 'radians', 'sin', 'sinh', 'sleep', 'sqrt', 'strftime', 'strptime', 
'struct_time', 'tan', 'tanh', 'time', 'timezone', 'trunc', 'tzname', 'x']

การใช้ข้อจำกัดกับพารามิเตอร์ร่วม

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

ตัวอย่าง

from time import *
exec("print(dir())",{})

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

['__builtins__']

อนุญาตเฉพาะฟังก์ชันที่เลือก

ต่อไปเราจะดูว่าเราสามารถใช้เฉพาะบางฟังก์ชันที่เลือกกับวิธี exec() จากโมดูลที่นำเข้าได้อย่างไร ในตัวอย่างด้านล่าง เราอนุญาตเฉพาะฟังก์ชันที่จำเป็นเป็นพารามิเตอร์พร้อมตัวเลือกส่วนกลาง ฟังก์ชัน localtime() เป็นส่วนหนึ่งของโมดูลเวลาซึ่งนำเข้ามาในโปรแกรม ตัวอย่าง

from time import *
exec("print lclt()",{"lclt":localtime})

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

time.struct_time(tm_year=2019, tm_mon=7, tm_mday=19, tm_hour=12, tm_min=33, tm_sec=53, tm_wday=4, tm_yday=200, tm_isdst=0)

ส่งพารามิเตอร์ท้องถิ่น

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

ตัวอย่าง

from time import *
exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

['dir', 'gtime', 'print']