Fungsi 1 bawaan Python memungkinkan Anda untuk mengeksekusi kode Python sewenang-wenang dari string atau input kode yang dikompilasi Show
Fungsi 1 dapat berguna saat Anda perlu menjalankan kode Python yang dihasilkan secara dinamis, tetapi bisa sangat berbahaya jika Anda menggunakannya secara sembarangan. Dalam tutorial ini, Anda tidak hanya akan mempelajari cara menggunakan 1, tetapi juga penting, kapan boleh menggunakan fungsi ini dalam kode AndaDalam tutorial ini, Anda akan mempelajari caranya
Selain itu, Anda akan menulis beberapa contoh penggunaan 1 untuk menyelesaikan berbagai masalah yang terkait dengan eksekusi kode dinamisUntuk mendapatkan hasil maksimal dari tutorial ini, Anda harus terbiasa dengan ruang nama dan ruang lingkup Python, dan string. Anda juga harus terbiasa dengan beberapa fungsi bawaan Python Kode sampel. Klik di sini untuk mengunduh kode contoh gratis yang akan Anda gunakan untuk menjelajahi kasus penggunaan fungsi exec() Mengenal Python >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)") >>> result 84 1Fungsi bawaan Python memungkinkan Anda mengeksekusi kode Python apa pun. Dengan fungsi ini, Anda dapat mengeksekusi kode yang dihasilkan secara dinamis. Itu adalah kode yang Anda baca, hasilkan secara otomatis, atau dapatkan selama eksekusi program Anda. Biasanya, ini adalah string Fungsi 1 mengambil sepotong kode dan mengeksekusinya seperti yang dilakukan juru bahasa Python Anda. 1 Python seperti 2 tetapi bahkan lebih kuat dan rentan terhadap masalah keamanan. Sementara _2 hanya dapat mengevaluasi ekspresi, 1 dapat mengeksekusi urutan pernyataan, serta impor, pemanggilan fungsi dan definisi, definisi kelas dan instantiasi, dan banyak lagi. Pada dasarnya, 1 dapat menjalankan seluruh program Python berfitur lengkapTanda tangan _1 memiliki bentuk sebagai berikut
Fungsi mengeksekusi _7, yang dapat berupa string yang berisi kode Python yang valid atau objek kode yang dikompilasiCatatan. Python adalah bahasa yang ditafsirkan, bukan yang dikompilasi. Namun, ketika Anda menjalankan beberapa kode Python, juru bahasa menerjemahkannya menjadi , yang merupakan representasi internal dari program Python dalam implementasi CPython. Terjemahan perantara ini juga disebut sebagai kode yang dikompilasi dan dieksekusi oleh Python Jika _7 adalah sebuah string, maka itu diurai sebagai rangkaian pernyataan Python, yang kemudian dikompilasi secara internal menjadi bytecode, dan akhirnya dieksekusi, kecuali terjadi kesalahan sintaksis selama langkah penguraian atau kompilasi. Jika _7 memegang objek kode yang dikompilasi, maka itu dieksekusi secara langsung, membuat prosesnya sedikit lebih efisienArgumen 0 dan 1 memungkinkan Anda untuk menyediakan kamus yang mewakili dan ruang nama di mana 1 akan menjalankan kode targetNilai pengembalian fungsi 1 adalah 4, mungkin karena tidak setiap potongan kode memiliki hasil akhir, unik, dan konkret. Ini mungkin hanya memiliki beberapa efek samping. Perilaku ini sangat berbeda dari _2, yang mengembalikan hasil ekspresi yang dievaluasiUntuk mendapatkan gambaran awal tentang cara kerja _1, Anda dapat membuat juru bahasa Python yang belum sempurna dengan dua baris kode>>> _Dalam contoh ini, Anda menggunakan loop 7 tak terbatas untuk meniru perilaku Python atau REPL. Di dalam loop, Anda gunakan untuk mendapatkan input pengguna di baris perintah. Kemudian Anda menggunakan _1 untuk memproses dan menjalankan inputContoh ini menunjukkan kasus penggunaan utama 1. mengeksekusi kode yang datang kepada Anda sebagai stringCatatan. Anda telah belajar bahwa menggunakan _1 dapat menyiratkan risiko keamanan. Sekarang setelah Anda melihat kasus penggunaan utama 1, menurut Anda apa risiko keamanan tersebut? Anda biasanya akan menggunakan _1 saat Anda perlu menjalankan kode yang datang sebagai string secara dinamis. Misalnya, Anda dapat menulis program yang menghasilkan string berisi kode Python yang valid. Anda dapat membuat string ini dari bagian-bagian yang Anda dapatkan pada saat yang berbeda dalam eksekusi program Anda. Anda juga dapat menggunakan input pengguna atau sumber input lainnya untuk membuat string iniSetelah Anda membuat kode target sebagai string, Anda dapat menggunakan 1 untuk mengeksekusinya seperti Anda mengeksekusi kode Python apa punDalam situasi ini, Anda jarang dapat memastikan isi string Anda. Itulah salah satu alasan mengapa 1 menyiratkan risiko keamanan yang serius. Ini terutama benar jika Anda menggunakan sumber input yang tidak tepercaya, seperti input langsung pengguna, dalam membuat kode AndaDalam pemrograman, fungsi seperti _1 adalah alat yang sangat ampuh karena memungkinkan Anda menulis program yang menghasilkan dan mengeksekusi kode baru secara dinamis. Untuk menghasilkan kode baru ini, program Anda hanya akan menggunakan informasi yang tersedia saat runtime. Untuk menjalankan kode, program Anda akan menggunakan 1Namun, dengan kekuatan besar datang tanggung jawab besar. Fungsi 1 menyiratkan serius , seperti yang akan segera Anda pelajari. Jadi, Anda harus menghindari penggunaan 1 sebagian besar waktuDi bagian berikut, Anda akan mempelajari cara kerja 1 dan cara menggunakan fungsi ini untuk mengeksekusi kode yang datang sebagai string atau sebagai objek kode terkompilasiHilangkan iklanMenjalankan Kode Dari Input StringCara paling umum untuk memanggil _1 adalah dengan kode yang berasal dari input berbasis string. Untuk membangun input berbasis string ini, Anda dapat menggunakan
Program one-liner terdiri dari satu baris kode yang melakukan beberapa tindakan sekaligus. Katakanlah Anda memiliki urutan angka, dan Anda ingin membuat urutan baru yang berisi jumlah kuadrat dari semua angka genap dalam urutan input Untuk mengatasi masalah ini, Anda dapat menggunakan kode one-liner berikut >>> _Di baris yang disorot, Anda menggunakan a untuk menghitung nilai kuadrat dari semua bilangan genap dalam urutan nilai masukan. Kemudian Anda menggunakan _2 untuk menghitung jumlah total kuadratUntuk menjalankan kode ini dengan _1, Anda hanya perlu mengubah kode satu baris Anda menjadi string satu baris>>> ________0______ Dalam contoh ini, Anda mengekspresikan kode one-liner sebagai string. Kemudian Anda memasukkan string ini ke 1 untuk dieksekusi. Satu-satunya perbedaan antara kode asli Anda dan string adalah string menyimpan hasil perhitungan dalam variabel untuk akses nanti. Ingat bahwa 1 mengembalikan 4 daripada hasil eksekusi konkret. Mengapa? Python memungkinkan Anda menulis banyak dalam satu baris kode, menggunakan titik koma untuk memisahkannya. Meskipun praktik ini tidak disarankan, tidak ada yang akan menghentikan Anda melakukan hal seperti ini >>> _Anda dapat menggunakan titik koma untuk memisahkan beberapa pernyataan dan membuat string baris tunggal yang berfungsi sebagai argumen untuk 1. Begini caranya>>> _Gagasan dari contoh ini adalah Anda dapat menggabungkan beberapa pernyataan Python menjadi string satu baris dengan menggunakan titik koma untuk memisahkannya. Dalam contoh, pernyataan pertama mengambil masukan pengguna, sedangkan pernyataan kedua mencetak pesan ucapan ke layar Anda juga dapat mengagregasi beberapa pernyataan dalam satu baris string menggunakan karakter baris baru, 8>>> _Karakter baris baru membuat 1 memahami string baris tunggal Anda sebagai kumpulan multibaris pernyataan Python. Kemudian 1 menjalankan pernyataan agregat berturut-turut, yang berfungsi seperti file kode multilinePendekatan terakhir untuk membangun input berbasis string untuk memberi makan 1 adalah dengan menggunakan string yang dikutip tiga kali. Pendekatan ini bisa dibilang lebih fleksibel dan memungkinkan Anda menghasilkan input berbasis string yang terlihat dan berfungsi seperti kode Python normalPenting untuk diperhatikan bahwa pendekatan ini mengharuskan Anda menggunakan indentasi dan pemformatan kode yang tepat. Perhatikan contoh berikut >>> _Dalam contoh ini, Anda menggunakan string yang dikutip tiga kali lipat untuk memberikan input ke 1. Perhatikan bahwa string ini terlihat seperti kode Python biasa. Itu menggunakan lekukan yang sesuai, gaya penamaan, dan pemformatan. Fungsi 1 akan memahami dan mengeksekusi string ini sebagai file kode Python biasaAnda harus mencatat bahwa ketika Anda mengirimkan string dengan kode ke 1, fungsi tersebut akan mengurai dan mengkompilasi kode target menjadi bytecode Python. Dalam semua kasus, string input harus berisi kode Python yang validJika 1 menemukan sintaks yang tidak valid selama langkah penguraian dan kompilasi, maka kode masukan tidak akan berjalan>>> _Dalam contoh ini, kode target berisi panggilan ke 6 yang menggunakan string sebagai argumen. String ini tidak diakhiri dengan benar dengan tanda kutip tunggal penutup, jadi 1 memunculkan 8 yang menunjukkan masalah dan tidak menjalankan kode masukan. Perhatikan bahwa Python menunjukkan kesalahan di awal string daripada di akhir, di mana tanda kutip tunggal penutup harus diletakkanMenjalankan kode yang datang sebagai string, seperti yang Anda lakukan pada contoh di atas, bisa dibilang merupakan cara alami menggunakan 1. Namun, jika Anda perlu menjalankan kode input berkali-kali, menggunakan string sebagai argumen akan membuat fungsi menjalankan langkah penguraian dan kompilasi setiap saat. Perilaku ini dapat membuat kode Anda tidak efisien dalam hal kecepatan eksekusiDalam situasi ini, pendekatan yang paling nyaman adalah mengkompilasi kode target sebelumnya dan kemudian menjalankan bytecode yang dihasilkan dengan 1 sebanyak yang diperlukan. Di bagian berikut, Anda akan mempelajari cara menggunakan 1 dengan objek kode yang dikompilasiHilangkan iklanMenjalankan Kode yang DikompilasiDalam praktiknya, 1 bisa sangat lambat saat Anda menggunakannya untuk memproses string yang berisi kode. Jika Anda perlu menjalankan sepotong kode secara dinamis lebih dari sekali, maka kompilasi terlebih dahulu akan menjadi pendekatan yang paling berkinerja dan direkomendasikan. Mengapa? Untuk mengkompilasi sepotong kode Python, Anda dapat menggunakan. Fungsi bawaan ini mengambil string sebagai argumen dan menjalankan kompilasi bytecode satu kali di atasnya, menghasilkan objek kode yang kemudian dapat Anda teruskan ke 1 untuk dieksekusiTanda tangan _3 memiliki bentuk sebagai berikut
Dalam tutorial ini, Anda hanya akan menggunakan tiga argumen pertama untuk 3. Argumen _7 menyimpan kode yang perlu Anda kompilasi menjadi bytecode. Argumen _8 akan menyimpan file dari mana kode dibaca. Untuk membaca dari objek string, Anda harus menyetel 8 ke nilai 00Catatan. Untuk menyelami lebih dalam argumen lainnya untuk 3, lihat pejabat fungsiTerakhir, 3 dapat menghasilkan objek kode yang dapat Anda jalankan menggunakan 1 atau 2, bergantung pada nilai argumen 05. Argumen ini harus disetel ke _06 atau 07, tergantung pada fungsi eksekusi target>>> 0Mengompilasi kode yang sering diulang di muka dengan 3 dapat membantu Anda sedikit meningkatkan kinerja kode dengan melewatkan langkah penguraian dan kompilasi bytecode pada setiap panggilan ke 1Menjalankan Kode Dari File Sumber PythonAnda juga dapat menggunakan 1 untuk menjalankan kode yang telah Anda baca dari file 11 yang andal di sistem file Anda atau di tempat lain. Untuk melakukannya, Anda dapat menggunakan fungsi bawaan untuk membaca konten file sebagai string, yang kemudian dapat Anda berikan sebagai argumen ke 1Misalnya, Anda memiliki file Python bernama 14 yang berisi kode berikut 1Contoh skrip ini mencetak salam dan pesan selamat datang ke layar. Ini juga mendefinisikan fungsi sampel _15 untuk tujuan pengujian. Fungsi mengambil nama sebagai argumen dan mencetak salam yang dikustomisasi ke layarSekarang kembali ke sesi interaktif Python Anda dan jalankan kode berikut >>> 2Dalam contoh ini, pertama-tama Anda membuka file target 11 sebagai file teks biasa menggunakan fungsi 12 bawaan dalam pernyataan 18. Kemudian Anda memanggil objek file untuk membaca konten file ke dalam variabel 7. Panggilan ke _19 mengembalikan konten file sebagai string. Langkah terakhir adalah memanggil _1 dengan string ini sebagai argumenContoh ini menjalankan kode dan membuat fungsi _15 dan objek yang ada di 14 tersedia di namespace Anda saat ini. Itu sebabnya Anda dapat menggunakan 15 secara langsung. Rahasia di balik perilaku ini berkaitan dengan argumen 0 dan 1, yang akan Anda pelajari di bagian selanjutnyaDengan menggunakan teknik pada contoh di atas, Anda dapat membuka, membaca, dan mengeksekusi file apa pun yang berisi kode Python. Teknik ini dapat bekerja ketika Anda tidak mengetahui sebelumnya file sumber mana yang akan Anda jalankan. Jadi, Anda tidak dapat menulis _28, karena Anda tidak tahu nama modul saat menulis kodeCatatan. Di Python, Anda akan menemukan cara yang lebih aman untuk mendapatkan hasil yang serupa. Anda dapat menggunakan sistem impor, misalnya. Untuk mempelajari alternatif ini lebih dalam, lihat Jika Anda pernah memilih untuk menggunakan teknik ini, pastikan Anda hanya mengeksekusi kode dari file sumber tepercaya. Idealnya, file sumber yang paling andal adalah yang Anda buat secara sadar untuk berjalan secara dinamis. Anda tidak boleh menjalankan file kode yang berasal dari sumber eksternal, termasuk pengguna Anda, tanpa memeriksa kode terlebih dahulu Hilangkan iklanMenggunakan >>> exec("name = input('Your name: '); print(f'Hello, {name}!')") Your name: Leodanis Hello, Leodanis! 0 dan >>> exec("name = input('Your name: '); print(f'Hello, {name}!')") Your name: Leodanis Hello, Leodanis! 1 ArgumenAnda dapat meneruskan konteks eksekusi ke _1 menggunakan argumen 0 dan 1. Argumen ini dapat menerima objek kamus yang akan berfungsi sebagai ruang nama global dan lokal yang akan digunakan 1 untuk menjalankan kode targetArgumen ini opsional. Jika Anda menghilangkannya, maka 1 akan mengeksekusi kode input dalam lingkup saat ini, dan semua nama dan objek dalam lingkup ini akan tersedia untuk 1. Demikian pula, semua nama dan objek yang Anda tetapkan dalam kode input akan tersedia dalam cakupan saat ini setelah panggilan ke 1Perhatikan contoh berikut >>> ________26______3 Contoh ini menunjukkan bahwa jika Anda memanggil _1 tanpa memberikan nilai spesifik ke argumen 0 dan 1, maka fungsi akan menjalankan kode masukan dalam lingkup saat ini. Dalam hal ini, ruang lingkup saat ini adalah globalPerhatikan bahwa setelah Anda memanggil 1, nama yang ditentukan dalam kode input juga tersedia dalam cakupan saat ini. Itu sebabnya Anda dapat mengakses _42 di baris kode terakhirJika Anda hanya memberikan nilai ke 0, maka nilai tersebut harus berupa kamus. Fungsi 1 akan menggunakan kamus ini untuk nama global dan lokal. Perilaku ini akan membatasi akses ke sebagian besar nama dalam cakupan saat ini>>> 4Pada panggilan pertama ke _1, Anda menggunakan kamus sebagai argumen 0. Karena kamus Anda tidak menyediakan kunci dengan nama 47, panggilan ke 1 tidak memiliki akses ke nama ini dan menimbulkan pengecualian 49Pada panggilan kedua ke _1, Anda memberikan kamus yang berbeda ke 0. Dalam hal ini, kamus berisi kedua variabel, 52 dan 47, yang memungkinkan fungsi bekerja dengan benar. Namun, kali ini Anda tidak memiliki akses ke 42 setelah panggilan ke 1. Mengapa? Jika Anda memanggil 1 dengan kamus 0 yang tidak mengandung kunci 59 secara eksplisit, maka Python akan secara otomatis memasukkan referensi ke atau ruang nama di bawah kunci itu. Jadi, semua objek bawaan akan dapat diakses dari kode target Anda>>> 5Dalam contoh ini, Anda telah memberikan kamus kosong ke argumen 0. Perhatikan bahwa 1 masih memiliki akses ke namespace bawaan karena namespace ini secara otomatis dimasukkan ke dalam kamus yang disediakan di bawah kunci 59Jika Anda memberikan nilai untuk argumen 1, maka itu bisa berupa objek apa saja. Objek pemetaan ini akan menampung namespace lokal saat 1 menjalankan kode target Anda>>> 6Panggilan ke _1 tertanam dalam fungsi dalam contoh ini. Oleh karena itu, Anda memiliki cakupan global (tingkat modul) dan cakupan lokal (tingkat fungsi). Argumen _0 memberikan nama 52 dari lingkup global, dan argumen 1 memberikan nama 47 dari lingkup lokalPerhatikan bahwa setelah menjalankan 70, Anda tidak memiliki akses ke 42 karena nama ini dibuat di bawah cakupan lokal 1, yang tidak tersedia dari luarDengan argumen 0 dan 1, Anda dapat men-tweak konteks di mana 1 menjalankan kode Anda. Argumen ini cukup membantu untuk meminimalkan risiko keamanan yang terkait dengan 1, tetapi Anda tetap harus memastikan bahwa Anda menjalankan kode hanya dari sumber tepercaya. Di bagian berikut, Anda akan mempelajari tentang risiko keamanan ini dan cara menanganinyaMengungkap dan Meminimalkan Risiko Keamanan Di Balik >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)") >>> result 84 1Seperti yang telah Anda pelajari sejauh ini, 1 adalah alat yang ampuh yang memungkinkan Anda mengeksekusi kode arbitrer yang datang kepada Anda sebagai string. Anda harus menggunakan _1 dengan sangat hati-hati dan hati-hati karena kemampuannya untuk menjalankan kode apa punBiasanya, kode yang memberi makan 1 dihasilkan secara dinamis saat runtime. Kode ini mungkin memiliki banyak sumber masukan, yang antara lain dapat mencakup pengguna program Anda, program lain, database, aliran data, dan koneksi jaringan.Dalam skenario ini, Anda tidak dapat sepenuhnya yakin apa isi string input. Jadi, kemungkinan menghadapi sumber kode input yang tidak tepercaya dan berbahaya cukup tinggi Masalah keamanan yang terkait dengan _1 adalah alasan paling umum mengapa banyak pengembang Python merekomendasikan untuk menghindari fungsi ini sama sekali. Menemukan solusi yang lebih baik, lebih cepat, lebih kuat, dan lebih aman hampir selalu memungkinkanNamun, jika Anda harus menggunakan _1 dalam kode Anda, maka pendekatan yang umumnya disarankan adalah menggunakannya dengan kamus 0 dan 1 eksplisitMasalah penting lainnya dengan _1 adalah bahwa hal itu melanggar asumsi mendasar dalam pemrograman. kode yang sedang Anda baca atau tulis adalah kode yang akan Anda jalankan saat menjalankan program. Bagaimana _1 mematahkan asumsi ini? . Kode baru ini mungkin sulit untuk diikuti, dipertahankan, atau bahkan dikontrolDi bagian berikut, Anda akan mempelajari beberapa rekomendasi, teknik, dan praktik yang harus Anda terapkan jika Anda perlu menggunakan 1 dalam kode AndaHilangkan iklanMenghindari Masukan Dari Sumber Tidak TepercayaJika pengguna Anda dapat menyediakan program Anda dengan kode Python sewenang-wenang saat runtime, maka masalah dapat muncul jika mereka memasukkan kode yang melanggar aturan keamanan Anda. Untuk mengilustrasikan masalah ini, kembali ke contoh juru bahasa Python yang menggunakan 1 untuk eksekusi kode>>> ________26______7 Sekarang katakanlah Anda ingin menggunakan teknik ini untuk mengimplementasikan juru bahasa Python interaktif di salah satu server web Linux Anda. Jika Anda mengizinkan pengguna untuk mengirimkan kode arbitrer ke program Anda secara langsung, maka pengguna jahat mungkin memberikan sesuatu seperti 89. Cuplikan kode ini mungkin akan menghapus semua konten disk server Anda, jadi jangan dijalankanUntuk mencegah risiko ini, Anda dapat membatasi akses ke sistem 90 dengan memanfaatkan kamus 0>>> ________26______8 Sistem _90 secara internal menggunakan fungsi 93 bawaan. Jadi, jika Anda melarang akses ke namespace bawaan, maka sistem ________26______90 tidak akan berfungsiMeskipun Anda dapat men-tweak kamus _0 seperti yang ditunjukkan pada contoh di atas, satu hal yang tidak boleh Anda lakukan adalah menggunakan 1 untuk menjalankan kode eksternal dan berpotensi tidak aman di komputer Anda sendiri. Bahkan jika Anda dengan hati-hati membersihkan dan memvalidasi input, Anda berisiko diretas. Jadi, sebaiknya Anda menghindari praktik iniMembatasi >>> exec("name = input('Your name: '); print(f'Hello, {name}!')") Your name: Leodanis Hello, Leodanis! 0 dan >>> exec("name = input('Your name: '); print(f'Hello, {name}!')") Your name: Leodanis Hello, Leodanis! 1 untuk Meminimalkan RisikoAnda dapat memberikan kamus khusus sebagai argumen 0 dan 1 jika Anda ingin menyempurnakan akses ke nama global dan lokal saat menjalankan kode dengan 1. Misalnya, jika Anda memberikan kamus kosong ke 0 dan 1, maka 1 tidak akan memiliki akses ke ruang nama global dan lokal Anda saat ini>>> 9Jika Anda memanggil 1 dengan kamus kosong untuk 0 dan 1, maka Anda melarang akses ke nama global dan lokal. Tweak ini memungkinkan Anda membatasi nama dan objek yang tersedia saat Anda menjalankan kode dengan 1Namun, teknik ini tidak menjamin penggunaan yang aman dari 1. Mengapa? >>> 0Dalam contoh ini, Anda menggunakan kamus kosong untuk 0 dan 1, tetapi 1 masih dapat mengakses fungsi bawaan seperti 15, 16, dan 6. Bagaimana Anda mencegah 1 mengakses nama bawaan? Memutuskan Nama Bawaan yang DiizinkanSeperti yang telah Anda pelajari, jika Anda meneruskan kamus khusus ke 0 tanpa kunci 59, Python akan secara otomatis memperbarui kamus itu dengan semua nama dalam cakupan bawaan di bawah kunci 59 baru. Untuk membatasi perilaku implisit ini, Anda dapat menggunakan kamus 0 yang berisi kunci 59 dengan nilai yang sesuaiMisalnya, jika Anda ingin melarang akses ke nama bawaan sepenuhnya, Anda dapat memanggil 1 seperti pada contoh berikut>>> 1Dalam contoh ini, Anda menyetel _0 ke kamus khusus yang berisi kunci 59 dengan kamus kosong sebagai nilai terkait. Praktik ini mencegah Python memasukkan referensi ke namespace bawaan ke 0. Dengan cara ini, Anda memastikan bahwa _1 tidak akan memiliki akses ke nama bawaan saat mengeksekusi kode AndaAnda juga dapat mengubah kunci _59 jika Anda memerlukan 1 untuk mengakses nama bawaan tertentu saja>>> 2Pada contoh pertama, 1 berhasil menjalankan kode input Anda karena 15 dan 6 ada di kamus yang terkait dengan kunci 59. Dalam contoh kedua, 1 memunculkan 49 dan tidak menjalankan kode input Anda karena 16 tidak ada dalam 38 yang disediakanTeknik dalam contoh di atas memungkinkan Anda meminimalkan implikasi keamanan penggunaan 1. Namun, teknik ini tidak sepenuhnya aman. Jadi, kapan pun Anda merasa perlu menggunakan 1, coba pikirkan solusi lain yang tidak menggunakan fungsi tersebutHilangkan iklanMenempatkan >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)") >>> result 84 _1 Menjadi TindakanHingga saat ini, Anda telah mempelajari cara kerja fungsi 1 bawaan. Anda tahu bahwa Anda dapat menggunakan _1 untuk menjalankan input berbasis string atau kode terkompilasi. Anda juga mengetahui bahwa fungsi ini dapat mengambil dua argumen opsional, 0 dan 1, yang memungkinkan Anda mengubah namespace eksekusi untuk 1Selain itu, Anda telah belajar bahwa menggunakan 1 menyiratkan beberapa masalah keamanan yang serius, termasuk mengizinkan pengguna untuk menjalankan kode Python arbitrer di komputer Anda. Anda mempelajari beberapa praktik pengkodean yang direkomendasikan yang membantu meminimalkan risiko keamanan yang terkait dengan 1 dalam kode AndaDi bagian berikut, Anda akan membuat kode beberapa contoh praktis yang akan membantu Anda menemukan kasus penggunaan yang menggunakan 1 dapat sesuaiMenjalankan Kode Dari Sumber EksternalMenggunakan 1 untuk mengeksekusi kode yang datang sebagai string baik dari pengguna Anda atau sumber lain mungkin merupakan kasus penggunaan 1 yang paling umum dan berbahaya. Fungsi ini adalah cara tercepat bagi Anda untuk menerima kode sebagai string dan menjalankannya sebagai kode Python biasa dalam konteks program tertentuAnda tidak boleh menggunakan _1 untuk menjalankan kode eksternal arbitrer pada mesin Anda, karena tidak ada cara yang aman untuk melakukannya. Jika Anda akan menggunakan _1, gunakan itu sebagai cara untuk membiarkan pengguna Anda menjalankan kode mereka sendiri di mesin mereka sendiriPustaka standar memiliki beberapa modul yang menggunakan 1 untuk mengeksekusi kode yang diberikan oleh pengguna sebagai string. Contoh yang baik adalah modul, yang awalnya ditulis sendiri oleh Guido van RossumModul _55 menyediakan cara cepat untuk mengatur waktu potongan kecil kode Python yang datang sebagai string. Lihat contoh berikut dari dokumentasi modul>>> 3Fungsi _57 mengambil cuplikan kode sebagai string, menjalankan kode, dan mengembalikan pengukuran waktu eksekusi. Fungsi ini juga membutuhkan beberapa argumen lain. Misalnya, _58 memungkinkan Anda untuk memberikan berapa kali Anda ingin mengeksekusi kode targetDi jantung fungsi ini, Anda akan menemukan kelasnya. _59 menggunakan 1 untuk menjalankan kode yang disediakan. Jika Anda memeriksa kode sumber _59 di modul 55, maka Anda akan menemukan bahwa kelas , 64, termasuk kode berikut _4Panggilan ke 1 di baris yang disorot mengeksekusi kode pengguna menggunakan 66 dan 67 sebagai ruang nama global dan lokalnyaCara menggunakan _1 ini sesuai saat Anda menyediakan alat untuk pengguna Anda, yang harus memberikan kode target mereka sendiri. Kode ini akan berjalan di mesin pengguna, jadi mereka akan bertanggung jawab untuk menjamin bahwa kode masukan aman untuk dijalankanContoh lain penggunaan 1 untuk menjalankan kode yang datang sebagai string adalah modul 70. Modul ini memeriksa docstring Anda untuk mencari teks yang terlihat seperti sesi interaktif Python. Jika _70 menemukan teks seperti sesi interaktif, teks tersebut akan dieksekusi sebagai kode Python untuk memeriksa apakah berfungsi seperti yang diharapkanMisalnya, Anda memiliki fungsi berikut untuk menjumlahkan dua angka _5Dalam cuplikan kode ini, _72 mendefinisikan sebuah docstring dengan beberapa tes yang memeriksa bagaimana fungsi seharusnya bekerja. Perhatikan bahwa tes mewakili panggilan ke _72 dalam sesi interaktif hipotetis menggunakan jenis argumen yang valid dan tidak validSetelah Anda memiliki tes interaktif ini dan hasil yang diharapkan dalam dokumen Anda, maka Anda dapat menggunakan 70 untuk menjalankannya dan memeriksa apakah mereka mengeluarkan hasil yang diharapkanCatatan. Modul doctest menyediakan alat luar biasa dan berguna yang dapat Anda gunakan untuk menguji kode saat Anda menulisnya Buka baris perintah Anda dan jalankan perintah berikut di direktori yang berisi file 75 Anda _6Perintah ini tidak akan mengeluarkan keluaran apa pun jika semua pengujian berfungsi seperti yang diharapkan. Jika setidaknya satu tes gagal, Anda akan mendapatkan pengecualian yang menunjukkan masalahnya. Untuk mengonfirmasi ini, Anda dapat mengubah salah satu output yang diharapkan dalam docstring fungsi dan menjalankan perintah di atas lagi Modul _70 menggunakan 1 untuk mengeksekusi kode yang disematkan docstring interaktif apa pun, seperti yang dapat Anda konfirmasikan dalam kode sumber modul _7Seperti yang dapat Anda konfirmasikan dalam cuplikan kode ini, kode pengguna dijalankan dalam panggilan 1, yang menggunakan 3 untuk mengompilasi kode target. Untuk menjalankan kode ini, 1 menggunakan 81 sebagai argumen 0. Perhatikan bahwa komentar tepat sebelum panggilan ke 1 dengan bercanda menyatakan bahwa ini adalah tempat di mana kode pengguna dijalankanSekali lagi, dalam kasus penggunaan _1 ini, tanggung jawab memberikan contoh kode aman ada pada pengguna. Pengelola _70 tidak bertanggung jawab untuk memastikan bahwa panggilan ke 1 tidak menyebabkan kerusakan apa punPenting untuk dicatat bahwa _70 tidak mencegah risiko keamanan yang terkait dengan 1. Dengan kata lain, _70 akan menjalankan kode Python apa pun. Misalnya, seseorang dapat memodifikasi fungsi 72 Anda untuk menyertakan kode berikut dalam docstring _8Jika Anda menjalankan _70 pada file ini, maka perintah 92 akan berhasil dijalankan. Dalam contoh ini, perintah yang disematkan sebagian besar tidak berbahaya. Namun, pengguna jahat dapat memodifikasi docstring Anda dan menyematkan sesuatu seperti 93 atau perintah berbahaya lainnyaSekali lagi, Anda harus selalu berhati-hati dengan 1 dan dengan alat yang menggunakan fungsi ini, seperti 70. Dalam kasus khusus _70, selama Anda tahu dari mana asal kode pengujian yang disematkan, alat ini akan cukup aman dan bergunaHilangkan iklanMenggunakan Python untuk File KonfigurasiSituasi lain di mana Anda dapat menggunakan 1 untuk menjalankan kode adalah ketika Anda memiliki file konfigurasi yang menggunakan sintaks Python yang valid. File Anda dapat menentukan beberapa parameter konfigurasi dengan nilai tertentu. Kemudian Anda dapat membaca file dan memproses kontennya dengan 1 untuk membuat objek kamus yang berisi semua parameter konfigurasi Anda dan nilainyaMisalnya, Anda memiliki file konfigurasi berikut untuk aplikasi editor teks yang sedang Anda kerjakan _9File ini memiliki sintaks Python yang valid, sehingga Anda dapat menjalankan kontennya menggunakan 1 seperti yang Anda lakukan dengan file 11 biasaCatatan. Anda akan menemukan beberapa cara yang lebih baik dan lebih aman untuk bekerja dengan file konfigurasi daripada menggunakan 1. Di pustaka standar Python, Anda memiliki modul, yang memungkinkan Anda memproses file konfigurasi yang menggunakan format file INIFungsi di bawah ini membaca file _03 Anda dan membuat kamus konfigurasi>>> 0Fungsi 04 mengambil jalur ke file konfigurasi. Kemudian ia membaca file target sebagai teks dan meneruskan teks itu ke 1 untuk dieksekusi. Selama menjalankan 1, fungsi memasukkan parameter konfigurasi ke dalam kamus 1, yang kemudian dikembalikan ke kode pemanggilCatatan. Teknik di bagian ini mungkin merupakan kasus penggunaan yang aman dari 1. Dalam contoh, Anda akan menjalankan aplikasi di sistem Anda, khususnya editor teksJika Anda memodifikasi file konfigurasi aplikasi untuk menyertakan kode berbahaya, Anda hanya akan merusak diri sendiri, yang kemungkinan besar tidak akan Anda lakukan. Namun, masih ada kemungkinan Anda secara tidak sengaja memasukkan kode yang berpotensi berbahaya ke dalam file konfigurasi aplikasi. Jadi, teknik ini bisa menjadi tidak aman jika Anda tidak hati-hati Tentu saja, jika Anda membuat kode aplikasi sendiri dan merilis file konfigurasi dengan kode berbahaya, Anda akan merugikan komunitas secara luas. Itu dia. Sekarang Anda dapat membaca semua parameter konfigurasi Anda dan nilainya yang sesuai dari kamus yang dihasilkan dan menggunakan parameter tersebut untuk menyiapkan proyek editor Anda KesimpulanAnda telah mempelajari cara menggunakan fungsi 1 bawaan untuk mengeksekusi kode Python dari input string atau bytecode. Fungsi ini menyediakan alat cepat untuk mengeksekusi kode Python yang dihasilkan secara dinamis. Anda juga mempelajari cara meminimalkan risiko keamanan yang terkait dengan 1 dan kapan boleh menggunakan fungsi dalam kode AndaDalam tutorial ini, Anda telah mempelajari caranya
Selain itu, Anda telah membuat kode beberapa contoh praktis yang membantu Anda lebih memahami kapan dan bagaimana menggunakan 1 dalam kode Python AndaKode sampel. Klik di sini untuk mengunduh kode contoh gratis yang akan Anda gunakan untuk menjelajahi kasus penggunaan fungsi exec() Tandai sebagai Selesai 🐍 Trik Python 💌 Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python Kirimi Saya Trik Python » Tentang Leodanis Pozo Ramos Leodanis adalah seorang insinyur industri yang menyukai Python dan pengembangan perangkat lunak. Dia adalah pengembang Python otodidak dengan pengalaman lebih dari 6 tahun. Dia adalah seorang penulis teknis yang rajin dengan semakin banyak artikel yang diterbitkan di Real Python dan situs lainnya » Lebih lanjut tentang LeodanisSetiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah Aldren Geir Arne Ian Kate Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista Tingkatkan Keterampilan Python Anda » Guru Keterampilan Python Dunia Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista Tingkatkan Keterampilan Python Anda » Bagaimana menurut anda? Nilai artikel ini Tweet Bagikan Bagikan EmailApa takeaway # 1 Anda atau hal favorit yang Anda pelajari? Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami Apa saja 3 jenis loop di Python?Jenis Loop . Untuk Loop. A for loop di Python digunakan untuk mengulangi urutan (daftar, tupel, set, kamus, dan string). Flow chart. . Sementara Loop. While loop digunakan untuk mengeksekusi satu set pernyataan selama kondisi benar. . Lingkaran Bersarang. Jika sebuah loop ada di dalam tubuh loop lain, itu disebut loop bersarang Apa itu variabel dinamis di Python?Nama variabel dinamis, terkadang disebut variabel, adalah variabel dengan nama yang merupakan estimasi dari variabel lain . Terlepas dari kenyataan bahwa Python adalah bahasa yang sangat dinamis di mana hampir semuanya adalah objek, dimungkinkan untuk membuat variabel dinamis dengan Python.
Apakah Python memiliki daftar dinamis?Dan daftar juga dinamis , artinya Anda dapat menambahkan elemen ke daftar atau menghapus elemen dari daftar sepenuhnya. Jadi daftarnya bisa bertambah atau menyusut tergantung bagaimana Anda menggunakannya.
Bagaimana Anda membuat rentang dinamis dengan Python?Bagaimana cara membuat rentang dinamis untuk loop? . saya = 1 untuk saya dalam rentang(1,i,1) cetak saya saya = saya +1 |