Python thực thi ()

Phương thức execute () thực thi chương trình được tạo động, là một chuỗi hoặc một đối tượng mã.

Cú pháp của exec():

 thực thi (đối tượng, hình cầu, địa phương)

Tham số execute ()

exec() có ba tham số:

  • đối tượng - Một chuỗi hoặc một đối tượng mã
  • toàn cầu (tùy chọn) - từ điển
  • địa phương (tùy chọn) - một đối tượng ánh xạ. Từ điển là loại ánh xạ tiêu chuẩn và thường được sử dụng trong Python.

Việc sử dụng hình cầu và địa phương sẽ được thảo luận ở phần sau của bài báo.

Giá trị trả lại từ thi hành ()

exec()không trả về bất kỳ giá trị nào, nó trả về None.

Ví dụ 1: Cách hoạt động của hàm executive ()?

 program = 'a = 5b=10print("Sum =", a+b)' exec(program)

Đầu ra

 Tổng = 15

Ở đây, chương trình đối tượng chuỗi được chuyển đến để exec()thực thi chương trình. hình cầu và địa phương bị bỏ qua trong trường hợp này.

Ví dụ 2: Cho phép người dùng cung cấp thông tin đầu vào

  program = input('Enter a program:') exec(program) 

Đầu ra

 Nhập chương trình: (in (mục) cho mục trong (1, 2, 3)) 1 2 3

Nếu bạn muốn lấy mã Python từ người dùng cho phép mã đa dòng (sử dụng ''), bạn có thể sử dụng compile()phương pháp trước khi sử dụng exec().

Tìm hiểu thêm về phương thức compile () trong Python.

Hãy cẩn thận khi sử dụng thi hành ()

Hãy xem xét một tình huống, bạn đang sử dụng hệ thống Unix (macOS, Linux, v.v.) và bạn đã nhập osmô-đun. Mô-đun hệ điều hành cung cấp một cách di động để sử dụng các chức năng của hệ điều hành như đọc hoặc ghi tệp.

Nếu bạn cho phép người dùng nhập một giá trị bằng cách sử dụng exec(input()), người dùng có thể ra lệnh để thay đổi tệp hoặc thậm chí xóa tất cả các tệp bằng lệnh os.system('rm -rf *').

Nếu bạn đang sử dụng exec(input())mã của mình, bạn nên kiểm tra các biến và phương pháp mà người dùng có thể sử dụng. Bạn có thể xem các biến và phương thức nào có sẵn bằng cách sử dụng phương thức dir ().

 from math import * exec('print(dir())')

Đầu ra

('Vào', 'Ra', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', ' _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' ceil ' , 'copysign', 'cos', 'cosh', 'Degree', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', ' floor ',' fmod ',' frexp ',' fsum ',' gamma ',' gcd ',' get_ipython ',' pseud ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , 'ldexp', 'lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' bỏ ',' radian ',' sin ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')

Hạn chế việc sử dụng các phương thức và biến có sẵn trong thi hành ()

Thường xuyên hơn không, tất cả các phương thức và biến có sẵn được sử dụng exec()có thể không cần thiết hoặc thậm chí có thể có lỗ hổng bảo mật. Bạn có thể hạn chế việc sử dụng các biến và phương thức này bằng cách chuyển các tham số toàn cầu và cục bộ tùy chọn (từ điển) vào exec()phương thức.

1. Cả hai tham số hình cầu và địa phương đều bị bỏ qua

Nếu cả hai tham số bị bỏ qua (như trong các ví dụ trước đó của chúng tôi), mã dự kiến ​​sẽ được thực thi exec()sẽ được thực thi trong phạm vi hiện tại. Bạn có thể kiểm tra các biến và phương pháp có sẵn bằng mã sau:

 executive ('print (dir ())')

2. Truyền tham số global; tham số địa phương bị bỏ qua

The globals and locals parameters (dictionaries) are used for global and local variables respectively. If locals dictionary is omitted, it defaults to globals dictionary. Meaning, globals will be used for both global and local variables.

Note: You can check the current global and local dictionary in Python using globals() and locals() built-in methods respectively.

3. Passing empty dictionary as globals parameter

 from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())

If you pass an empty dictionary as globals, only the __builtins__ are available to the object (first parameter to the exec()). Even though we have imported math module in the above program, trying to access any of the functions provided by the math module will raise an exception.

Output

 ('__builtins__')

Making Certain Methods available

 from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))

Here, the code that is executed by exec() can also have sqrt() and pow() methods along with __builtins__.

It's possible to change the name of the method according to your wish.

 from math import * exec('print(dir())', ('squareRoot': sqrt, 'pow': pow)) # object can have squareRoot() module exec('print(squareRoot(9))', ('squareRoot': sqrt, 'pow': pow))

In the above program, squareRoot() calculates the square root (similar functionality like sqrt()). However, trying to use sqrt() will raise an exception.

Restricting the Use of built-ins

You can restrict the use of __builtins__ by giving value None to the '__builtins__' in the globals dictionary.

 exec(object, ('__builtins__': None)) 

4. Passing both globals and locals dictionary

You can make needed functions and variables available for use by passing locals dictionary. For example:

 from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)

Output

 ('dir', 'print') 

Ở đây, chỉ có hai phương thức có sẵn print () và dir () có thể được thực thi theo exec()phương thức.

Điều quan trọng cần lưu ý là, exec()thực thi mã và không trả về bất kỳ giá trị nào (trả về None). Do đó, bạn không thể sử dụng các câu lệnh trả về và lợi nhuận bên ngoài các định nghĩa hàm.

thú vị bài viết...