Python exec ()

Metode exec () mengeksekusi program yang dibuat secara dinamis, yang berupa string atau objek kode.

Sintaks exec():

 exec (objek, global, penduduk setempat)

exec () Parameter

exec() mengambil tiga parameter:

  • objek - Baik string atau objek kode
  • global (opsional) - kamus
  • penduduk setempat (opsional) - objek pemetaan. Kamus adalah tipe pemetaan standar dan umum digunakan dengan Python.

Penggunaan global dan lokal akan dibahas nanti di artikel.

Nilai Kembali dari exec ()

exec()tidak mengembalikan nilai apa pun, ia mengembalikan None.

Contoh 1: Bagaimana cara kerja exec ()?

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

Keluaran

 Jumlah = 15

Di sini, program objek string diteruskan ke exec()mana menjalankan program. global dan lokal dihilangkan dalam kasus ini.

Contoh 2: Izinkan pengguna untuk memberikan masukan

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

Keluaran

 Masuk program: (print (item) untuk item di (1, 2, 3)) 1 2 3

Jika Anda ingin mengambil kode Python dari pengguna yang memungkinkan kode multiline (menggunakan ''), Anda dapat menggunakan compile()metode sebelum menggunakan exec().

Pelajari lebih lanjut tentang metode compile () dengan Python.

Hati-hati saat menggunakan exec ()

Pertimbangkan situasi, Anda menggunakan sistem Unix (macOS, Linux dll) dan Anda telah mengimpor osmodul. Modul os menyediakan cara portabel untuk menggunakan fungsionalitas sistem operasi seperti membaca atau menulis file.

Jika Anda mengizinkan pengguna untuk memasukkan nilai menggunakan exec(input()), pengguna dapat mengeluarkan perintah untuk mengubah file atau bahkan menghapus semua file menggunakan perintah os.system('rm -rf *').

Jika Anda menggunakan exec(input())kode Anda, sebaiknya periksa variabel dan metode mana yang dapat digunakan pengguna. Anda dapat melihat variabel dan metode mana yang tersedia menggunakan metode dir ().

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

Keluaran

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

Membatasi Penggunaan Metode dan Variabel yang Tersedia di exec ()

Lebih sering daripada tidak, semua metode dan variabel yang tersedia yang digunakan exec()mungkin tidak diperlukan, atau bahkan mungkin memiliki celah keamanan. Anda dapat membatasi penggunaan variabel dan metode ini dengan meneruskan parameter global dan lokal opsional (kamus) ke exec()metode.

1. Parameter global dan lokal dihilangkan

Jika kedua parameter dihilangkan (seperti pada contoh sebelumnya), kode yang diharapkan untuk dieksekusi exec()dieksekusi dalam lingkup saat ini. Anda dapat memeriksa variabel dan metode yang tersedia menggunakan kode berikut:

 exec ('print (dir ())')

2. Meneruskan parameter global; parameter lokal dihilangkan

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') 

Di sini, hanya dua metode bawaan print () dan dir () yang dapat dijalankan oleh exec()metode.

Penting untuk dicatat bahwa, exec()mengeksekusi kode dan tidak mengembalikan nilai apa pun (mengembalikan None). Karenanya, Anda tidak dapat menggunakan pernyataan return dan yield di luar definisi fungsi.

Artikel yang menarik...