Hàm Exec có thể tự động thực thi mã của các chương trình python. Mã có thể được chuyển dưới dạng chuỗi hoặc mã đối tượng cho hàm này. Mã đối tượng được thực thi nguyên trạng trong khi chuỗi được phân tích cú pháp đầu tiên và được kiểm tra xem có lỗi cú pháp nào không. Nếu không có lỗi cú pháp, thì chuỗi đã phân tích cú pháp được thực thi dưới dạng một câu lệnh python.
Cú pháp cho hàm executive ()
exec(object, globals, locals)
Ở đâu
-
Đối tượng - Một chuỗi hoặc một đối tượng mã được truyền vào phương thức.
-
hình cầu - Từ điển các phương thức và biến toàn cục có sẵn.
-
người dân địa phương - Từ điển các phương thức và biến cục bộ có sẵn.
Chuỗi truyền
Trong ví dụ dưới đây, chúng ta chuyển một dòng mã duy nhất dưới dạng chuỗi vào hàm thi hành (). Nó được phân tích cú pháp và thực thi để đưa ra kết quả.
x = 9 exec ('print(5*x)')
Đầu ra
Chạy đoạn mã trên cho chúng ta kết quả sau -
45
Đối tượng mã chuyển
Bây giờ chúng ta xem cách chuyển một khối mã với nhiều câu lệnh mã. Vì nó là một đối tượng mã, nó được thực thi trực tiếp cho kết quả. Vui lòng lưu ý cách chúng tôi đã sử dụng \ n và không gian để tạo một khối mã python với chú thích thích hợp.
Ví dụ
prog_block = 'x = 3 \nif(x < 5): \n print x*x' exec(prog_block)
Đầu ra
Chạy đoạn mã trên cho chúng ta kết quả sau -
9
Không có Tham số Toàn cục và Cục bộ
Khi chúng tôi không chuyển bất kỳ giá trị nào cho tham số toàn cục và cục bộ, chúng tôi sẽ nhận được các chức năng có sẵn mặc định theo gói được nhập vào chương trình. Trong ví dụ dưới đây, chúng ta thấy mã cung cấp cho chúng ta tất cả các chức năng có sẵn khi cả giá trị tham số toàn cục và cục bộ đều bị bỏ qua.
from time import * exec("print(dir())")
Chạy đoạn mã trên cho chúng ta kết quả sau -
['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']
Áp dụng các hạn chế với các tham số chung
Chúng tôi có thể hạn chế quyền truy cập vào bất kỳ chức năng nào của mô-đun đã nhập bằng cách chuyển một từ điển trống làm tham số chung. Trong trường hợp này, kết quả sẽ chỉ hiển thị chức năng cài sẵn và nó sẽ không hiển thị bất kỳ chức năng nào từ mô-đun đã nhập. Đó là cách chúng tôi hạn chế và làm cho chức năng an toàn hơn.
Ví dụ
from time import * exec("print(dir())",{})
Đầu ra
Chạy đoạn mã trên cho chúng ta kết quả sau -
['__builtins__']
Chỉ cho phép các chức năng đã chọn
Tiếp theo, chúng ta xem cách chúng ta có thể chỉ áp dụng một số hàm đã chọn cho phương thức execute () từ mô-đun đã nhập. Trong ví dụ dưới đây, chúng tôi chỉ cho phép hàm bắt buộc dưới dạng tham số với tùy chọn Toàn cục. Hàm localtime () là một phần của mô-đun thời gian được nhập vào chương trình. Ví dụ
from time import * exec("print lclt()",{"lclt":localtime})
Đầu ra
Chạy đoạn mã trên cho chúng ta kết quả sau -
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)
Truyền tham số cục bộ
Chúng ta cũng có thể hạn chế việc sử dụng các chức năng khác nhau của các mô-đun đã nhập bằng cách sử dụng tham số cục bộ và loại trừ hoàn toàn các chức năng được tích hợp sẵn. Trong ví dụ dưới đây, chúng tôi chọn Không có làm giá trị cho thông số toàn cầu được tích hợp sẵn.
Ví dụ
from time import * exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})
Chạy đoạn mã trên cho chúng ta kết quả sau -
['dir', 'gtime', 'print']