วิธี Python eval() ใช้เพื่อแยกสตริงนิพจน์เป็นนิพจน์หลาม จากนั้นรันนิพจน์หลามภายในโปรแกรม
ไวยากรณ์
ไวยากรณ์ของเมธอด python eval() ทั่วไปคือ
eval(expression, globals=None, locals=None)
ที่ไหน:
-
การแสดงออก :พารามิเตอร์สตริงที่จำเป็น นี่คือสตริงนิพจน์ที่กำลังแยกวิเคราะห์และดำเนินการเป็นนิพจน์หลาม
-
ทั่วโลก :พารามิเตอร์ทางเลือกคือพจนานุกรมที่ใช้ระบุนิพจน์ที่พร้อมใช้งาน หากไม่ระบุไว้อย่างชัดเจน มีเมธอดในตัวมาตรฐานเช่น '__builtins__':ไม่มีองค์ประกอบ
-
ชาวบ้าน :พารามิเตอร์ทางเลือก ใช้เพื่อระบุตัวแปรท้องถิ่นและเมธอดที่ใช้ได้กับฟังก์ชัน eval()
ตอนนี้เพื่อให้เข้าใจวิธีการ eval() ได้ดีขึ้น เรามาทำความเข้าใจกับตัวอย่างต่างๆ กัน
เมธอด eval() อย่างง่าย
str1 = 'Hello' print(eval('str1 =="Hello"')) print(eval('str1 + ", Python"'))
ผลลัพธ์
True Hello, Python
เมธอด Python eval() พร้อมอินพุตของผู้ใช้
from math import * for l in range(1,3): func = input("Enter Math Function to Evaluate:\n") try: print(eval(func)) except Exception as ex: print(ex) break print('Done')
ผลลัพธ์
Enter Math Function to Evaluate: abs(-42) 42 Enter Math Function to Evaluate: max(12, 3, 4 , 2, 17) 17 Done
Python eval() globals และ locals
ก่อนทำความเข้าใจว่าเราต้องส่งฟังก์ชันใดไปยังเมธอด eval() มาดูรายการฟังก์ชันและตัวแปรทั้งหมดที่มีอยู่ในขอบเขตส่วนกลางและในเครื่อง
from math import * def square_root(n): return sqrt(n) # Print current global symbol table as a dictionary print('List of Global symbols:\n',globals()) #Print current local symbol table as a dictionary print('\nList of Local symbols:\n',locals()) #print list of names in the current local scope print('\nList of names in current local scope:\n',dir())
ผลลัพธ์
List of Global symbols: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Python/Python361/eval_example1.py', 'acos': <built-in function acos>, 'acosh': <built-in function acosh>, 'asin': <built-in function asin>, 'asinh': <built-in function asinh>, 'atan': <built-in function atan>, 'atan2': <built-in function atan2>, 'atanh': <built-in function atanh>, 'ceil': <built-in function ceil>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'cosh': <built-in function cosh>, 'degrees': <built-in function degrees>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'exp': <built-in function exp>, 'expm1': <built-in function expm1>, 'fabs': <built-in function fabs>, 'factorial': <built-in function factorial>, 'floor': <built-in function floor>, 'fmod': <built-in function fmod>, 'frexp': <built-in function frexp>, 'fsum': <built-in function fsum>, 'gamma': <built-in function gamma>, 'gcd': <built-in function gcd>, 'hypot': <built-in function hypot>, 'isclose': <built-in function isclose>, 'isfinite': <built-in function isfinite>, 'isinf': <built-in function isinf>, 'isnan': <built-in function isnan>, 'ldexp': <built-in function ldexp>, 'lgamma': <built-in function lgamma>, 'log': <built-in function log>, 'log1p': <built-in function log1p>, 'log10': <built-in function log10>, 'log2': <built-in function log2>, 'modf': <built-in function modf>, 'pow': <built-in function pow>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'sinh': <built-in function sinh>, 'sqrt': <built-in function sqrt>, 'tan': <built-in function tan>, 'tanh': <built-in function tanh>, 'trunc': <built-in function trunc>, 'pi': 3.141592653589793, 'e': 2.718281828459045, 'tau': 6.283185307179586, 'inf': inf, 'nan': nan, 'square_root': <function square_root at 0x055246F0> } List of Local symbols: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Python/Python361/eval_example1.py', 'acos': <built-in function acos>, 'acosh': <built-in function acosh>, 'asin': <built-in function asin>, 'asinh': <built-in function asinh>, 'atan': <built-in function atan>, 'atan2': <built-in function atan2>, 'atanh': <built-in function atanh>, 'ceil': <built-in function ceil>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'cosh': <built-in function cosh>, 'degrees': <built-in function degrees>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'exp': <built-in function exp>, 'expm1': <built-in function expm1>, 'fabs': <built-in function fabs>, 'factorial': <built-in function factorial>, 'floor': <built-in function floor>, 'fmod': <built-in function fmod>, 'frexp': <built-in function frexp>, 'fsum': <built-in function fsum>, 'gamma': <built-in function gamma>, 'gcd': <built-in function gcd>, 'hypot': <built-in function hypot>, 'isclose': <built-in function isclose>, 'isfinite': <built-in function isfinite>, 'isinf': <built-in function isinf>, 'isnan': <built-in function isnan>, 'ldexp': <built-in function ldexp>, 'lgamma': <built-in function lgamma>, 'log': <built-in function log>, 'log1p': <built-in function log1p>, 'log10': <built-in function log10>, 'log2': <built-in function log2>, 'modf': <built-in function modf>, 'pow': <built-in function pow>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'sinh': <built-in function sinh>, 'sqrt': <built-in function sqrt>, 'tan': <built-in function tan>, 'tanh': <built-in function tanh>, 'trunc': <built-in function trunc>, 'pi': 3.141592653589793, 'e': 2.718281828459045, 'tau': 6.283185307179586, 'inf': inf, 'nan': nan, 'square_root': <function square_root at 0x055246F0> } List of names in current local scope: ['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'square_root', 'tan', 'tanh', 'tau', 'trunc' ]
ด้านล่างเราจะเห็นว่าเราสามารถระบุค่า globals เป็นพจนานุกรมว่างในฟังก์ชัน eval:
>>> print(eval('dir()', {})) ['__builtins__']
มาดูตัวอย่างอื่นที่เราอนุญาตให้เข้าถึงวิธีการบางส่วนจากโมดูลคณิตศาสตร์เท่านั้น
from math import * for l in range(1, 4): func = input("Enter Math Function to Evaluate.\nAllowed Functions are: abs(x) and pow(x,y):\n") try: print(eval(func, {'absolute': abs, 'pow': pow})) except Exception as ex: print(ex) break print('Done')
ผลลัพธ์
Enter Math Function to Evaluate. Allowed Functions are: abs(x) and pow(x,y): abs(-74) 74 Enter Math Function to Evaluate. Allowed Functions are: abs(x) and pow(x,y): pow(2,7) 128.0 Enter Math Function to Evaluate. Allowed Functions are: abs(x) and pow(x,y): sqrt(47) name 'sqrt' is not defined Done