Dinamis untuk loop di python

Fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 bawaan Python memungkinkan Anda untuk mengeksekusi kode Python sewenang-wenang dari string atau input kode yang dikompilasi

Fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, tetapi juga penting, kapan boleh menggunakan fungsi ini dalam kode Anda

Dalam tutorial ini, Anda akan mempelajari caranya

  • Bekerja dengan fungsi
    >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
    >>> result
    84
    
    1 bawaan Python
  • Gunakan
    >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
    >>> result
    84
    
    1 untuk mengeksekusi kode yang datang sebagai string atau objek kode terkompilasi
  • Nilai dan minimalkan risiko keamanan yang terkait dengan penggunaan
    >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
    >>> result
    84
    
    1 dalam kode Anda

Selain itu, Anda akan menulis beberapa contoh penggunaan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk menyelesaikan berbagai masalah yang terkait dengan eksekusi kode dinamis

Untuk 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 1

Fungsi 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

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 mengambil sepotong kode dan mengeksekusinya seperti yang dilakukan juru bahasa Python Anda.
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 Python seperti
>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
2 tetapi bahkan lebih kuat dan rentan terhadap masalah keamanan. Sementara
>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
_2 hanya dapat mengevaluasi ekspresi,
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dapat mengeksekusi urutan pernyataan, serta impor, pemanggilan fungsi dan definisi, definisi kelas dan instantiasi, dan banyak lagi. Pada dasarnya,
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dapat menjalankan seluruh program Python berfitur lengkap

Tanda tangan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 memiliki bentuk sebagai berikut

exec(code [, globals [, locals]])

Fungsi mengeksekusi

>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
_7, yang dapat berupa string yang berisi kode Python yang valid atau objek kode yang dikompilasi

Catatan. 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

>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
_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
>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
_7 memegang objek kode yang dikompilasi, maka itu dieksekusi secara langsung, membuat prosesnya sedikit lebih efisien

Argumen

>>> 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 memungkinkan Anda untuk menyediakan kamus yang mewakili dan ruang nama di mana
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 akan menjalankan kode target

Nilai pengembalian fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 adalah
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
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
>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
_2, yang mengembalikan hasil ekspresi yang dievaluasi

Untuk mendapatkan gambaran awal tentang cara kerja

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1, Anda dapat membuat juru bahasa Python yang belum sempurna dengan dua baris kode

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_

Dalam contoh ini, Anda menggunakan loop

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
7 tak terbatas untuk meniru perilaku Python atau REPL. Di dalam loop, Anda gunakan untuk mendapatkan input pengguna di baris perintah. Kemudian Anda menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 untuk memproses dan menjalankan input

Contoh ini menunjukkan kasus penggunaan utama

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. mengeksekusi kode yang datang kepada Anda sebagai string

Catatan. Anda telah belajar bahwa menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 dapat menyiratkan risiko keamanan. Sekarang setelah Anda melihat kasus penggunaan utama
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, menurut Anda apa risiko keamanan tersebut?

Anda biasanya akan menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_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 ini

Setelah Anda membuat kode target sebagai string, Anda dapat menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk mengeksekusinya seperti Anda mengeksekusi kode Python apa pun

Dalam situasi ini, Anda jarang dapat memastikan isi string Anda. Itulah salah satu alasan mengapa

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menyiratkan risiko keamanan yang serius. Ini terutama benar jika Anda menggunakan sumber input yang tidak tepercaya, seperti input langsung pengguna, dalam membuat kode Anda

Dalam pemrograman, fungsi seperti

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1

Namun, dengan kekuatan besar datang tanggung jawab besar. Fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menyiratkan serius , seperti yang akan segera Anda pelajari. Jadi, Anda harus menghindari penggunaan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 sebagian besar waktu

Di bagian berikut, Anda akan mempelajari cara kerja

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dan cara menggunakan fungsi ini untuk mengeksekusi kode yang datang sebagai string atau sebagai objek kode terkompilasi

Hilangkan iklan

Menjalankan Kode Dari Input String

Cara paling umum untuk memanggil

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 adalah dengan kode yang berasal dari input berbasis string. Untuk membangun input berbasis string ini, Anda dapat menggunakan

  • Satu baris kode atau cuplikan kode satu baris
  • Beberapa baris kode dipisahkan oleh titik koma
  • Beberapa baris kode dipisahkan oleh karakter baris baru
  • Beberapa baris kode dalam string yang dikutip tiga kali lipat dan dengan indentasi yang tepat

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

>>>

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_

Di baris yang disorot, Anda menggunakan a untuk menghitung nilai kuadrat dari semua bilangan genap dalam urutan nilai masukan. Kemudian Anda menggunakan

>>> code = """
.. numbers = [2, 3, 7, 4, 8]
...
.. def is_even(number):
..     return number % 2 == 0
...
.. even_numbers = [number for number in numbers if is_even(number)]
...
.. squares = [number**2 for number in even_numbers]
...
.. result = sum(squares)
...
.. print("Original data:", numbers)
.. print("Even numbers:", even_numbers)
.. print("Square values:", squares)
.. print("Sum of squares:", result)
.. """

>>> exec(code)
Original data: [2, 3, 7, 4, 8]
Even numbers: [2, 4, 8]
Square values: [4, 16, 64]
Sum of squares: 84
_2 untuk menghitung jumlah total kuadrat

Untuk menjalankan kode ini dengan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_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

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk dieksekusi. Satu-satunya perbedaan antara kode asli Anda dan string adalah string menyimpan hasil perhitungan dalam variabel untuk akses nanti. Ingat bahwa
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 mengembalikan
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
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

>>>

>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
_

Anda dapat menggunakan titik koma untuk memisahkan beberapa pernyataan dan membuat string baris tunggal yang berfungsi sebagai argumen untuk

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Begini caranya

>>>

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
_

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,

>>> code = """
.. numbers = [2, 3, 7, 4, 8]
...
.. def is_even(number):
..     return number % 2 == 0
...
.. even_numbers = [number for number in numbers if is_even(number)]
...
.. squares = [number**2 for number in even_numbers]
...
.. result = sum(squares)
...
.. print("Original data:", numbers)
.. print("Even numbers:", even_numbers)
.. print("Square values:", squares)
.. print("Sum of squares:", result)
.. """

>>> exec(code)
Original data: [2, 3, 7, 4, 8]
Even numbers: [2, 4, 8]
Square values: [4, 16, 64]
Sum of squares: 84
8

>>>

>>> exec("name = input('Your name: ')\nprint(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
_

Karakter baris baru membuat

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 memahami string baris tunggal Anda sebagai kumpulan multibaris pernyataan Python. Kemudian
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menjalankan pernyataan agregat berturut-turut, yang berfungsi seperti file kode multiline

Pendekatan terakhir untuk membangun input berbasis string untuk memberi makan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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 normal

Penting untuk diperhatikan bahwa pendekatan ini mengharuskan Anda menggunakan indentasi dan pemformatan kode yang tepat. Perhatikan contoh berikut

>>>

>>> code = """
.. numbers = [2, 3, 7, 4, 8]
...
.. def is_even(number):
..     return number % 2 == 0
...
.. even_numbers = [number for number in numbers if is_even(number)]
...
.. squares = [number**2 for number in even_numbers]
...
.. result = sum(squares)
...
.. print("Original data:", numbers)
.. print("Even numbers:", even_numbers)
.. print("Square values:", squares)
.. print("Sum of squares:", result)
.. """

>>> exec(code)
Original data: [2, 3, 7, 4, 8]
Even numbers: [2, 4, 8]
Square values: [4, 16, 64]
Sum of squares: 84
_

Dalam contoh ini, Anda menggunakan string yang dikutip tiga kali lipat untuk memberikan input ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Perhatikan bahwa string ini terlihat seperti kode Python biasa. Itu menggunakan lekukan yang sesuai, gaya penamaan, dan pemformatan. Fungsi
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 akan memahami dan mengeksekusi string ini sebagai file kode Python biasa

Anda harus mencatat bahwa ketika Anda mengirimkan string dengan kode ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, fungsi tersebut akan mengurai dan mengkompilasi kode target menjadi bytecode Python. Dalam semua kasus, string input harus berisi kode Python yang valid

Jika

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menemukan sintaks yang tidak valid selama langkah penguraian dan kompilasi, maka kode masukan tidak akan berjalan

>>>

>>> exec("print('Hello, World!)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    File "<string>", line 1
      print('Hello, World!)
            ^
SyntaxError: unterminated string literal (detected at line 1)
_

Dalam contoh ini, kode target berisi panggilan ke

>>> exec("print('Hello, World!)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    File "<string>", line 1
      print('Hello, World!)
            ^
SyntaxError: unterminated string literal (detected at line 1)
6 yang menggunakan string sebagai argumen. String ini tidak diakhiri dengan benar dengan tanda kutip tunggal penutup, jadi
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 memunculkan
>>> exec("print('Hello, World!)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    File "<string>", line 1
      print('Hello, World!)
            ^
SyntaxError: unterminated string literal (detected at line 1)
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 diletakkan

Menjalankan kode yang datang sebagai string, seperti yang Anda lakukan pada contoh di atas, bisa dibilang merupakan cara alami menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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 eksekusi

Dalam situasi ini, pendekatan yang paling nyaman adalah mengkompilasi kode target sebelumnya dan kemudian menjalankan bytecode yang dihasilkan dengan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 sebanyak yang diperlukan. Di bagian berikut, Anda akan mempelajari cara menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dengan objek kode yang dikompilasi

Hilangkan iklan

Menjalankan Kode yang Dikompilasi

Dalam praktiknya,

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk dieksekusi

Tanda tangan

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
_3 memiliki bentuk sebagai berikut

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

Dalam tutorial ini, Anda hanya akan menggunakan tiga argumen pertama untuk

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
3. Argumen
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
_7 menyimpan kode yang perlu Anda kompilasi menjadi bytecode. Argumen
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
_8 akan menyimpan file dari mana kode dibaca. Untuk membaca dari objek string, Anda harus menyetel
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
8 ke nilai
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
00

Catatan. Untuk menyelami lebih dalam argumen lainnya untuk

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
3, lihat pejabat fungsi

Terakhir,

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
3 dapat menghasilkan objek kode yang dapat Anda jalankan menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 atau
>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
2, bergantung pada nilai argumen
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
05. Argumen ini harus disetel ke
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_06 atau
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
07, tergantung pada fungsi eksekusi target

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
0

Mengompilasi kode yang sering diulang di muka dengan

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
3 dapat membantu Anda sedikit meningkatkan kinerja kode dengan melewatkan langkah penguraian dan kompilasi bytecode pada setiap panggilan ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1

Menjalankan Kode Dari File Sumber Python

Anda juga dapat menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk menjalankan kode yang telah Anda baca dari file
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1

Misalnya, Anda memiliki file Python bernama

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
14 yang berisi kode berikut

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
1

Contoh skrip ini mencetak salam dan pesan selamat datang ke layar. Ini juga mendefinisikan fungsi sampel

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_15 untuk tujuan pengujian. Fungsi mengambil nama sebagai argumen dan mencetak salam yang dikustomisasi ke layar

Sekarang kembali ke sesi interaktif Python Anda dan jalankan kode berikut

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
2

Dalam contoh ini, pertama-tama Anda membuka file target

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
11 sebagai file teks biasa menggunakan fungsi
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
12 bawaan dalam pernyataan
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
18. Kemudian Anda memanggil objek file untuk membaca konten file ke dalam variabel
>>> name = input("Your name: "); print(f"Hello, {name}!")
Your name: Leodanis
Hello, Leodanis!
7. Panggilan ke
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_19 mengembalikan konten file sebagai string. Langkah terakhir adalah memanggil
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 dengan string ini sebagai argumen

Contoh ini menjalankan kode dan membuat fungsi

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_15 dan objek yang ada di
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
14 tersedia di namespace Anda saat ini. Itu sebabnya Anda dapat menggunakan
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
15 secara langsung. Rahasia di balik perilaku ini berkaitan dengan argumen
>>> 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, yang akan Anda pelajari di bagian selanjutnya

Dengan 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

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_28, karena Anda tidak tahu nama modul saat menulis kode

Catatan. 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 iklan

Menggunakan >>> 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 Argumen

Anda dapat meneruskan konteks eksekusi ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 menggunakan argumen
>>> 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. Argumen ini dapat menerima objek kamus yang akan berfungsi sebagai ruang nama global dan lokal yang akan digunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk menjalankan kode target

Argumen ini opsional. Jika Anda menghilangkannya, maka

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 akan mengeksekusi kode input dalam lingkup saat ini, dan semua nama dan objek dalam lingkup ini akan tersedia untuk
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Demikian pula, semua nama dan objek yang Anda tetapkan dalam kode input akan tersedia dalam cakupan saat ini setelah panggilan ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1

Perhatikan contoh berikut

>>> ________26______3

Contoh ini menunjukkan bahwa jika Anda memanggil

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 tanpa memberikan nilai spesifik ke argumen
>>> 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, maka fungsi akan menjalankan kode masukan dalam lingkup saat ini. Dalam hal ini, ruang lingkup saat ini adalah global

Perhatikan bahwa setelah Anda memanggil

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, nama yang ditentukan dalam kode input juga tersedia dalam cakupan saat ini. Itu sebabnya Anda dapat mengakses
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_42 di baris kode terakhir

Jika Anda hanya memberikan nilai ke

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0, maka nilai tersebut harus berupa kamus. Fungsi
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 akan menggunakan kamus ini untuk nama global dan lokal. Perilaku ini akan membatasi akses ke sebagian besar nama dalam cakupan saat ini

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
4

Pada panggilan pertama ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1, Anda menggunakan kamus sebagai argumen
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0. Karena kamus Anda tidak menyediakan kunci dengan nama
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
47, panggilan ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 tidak memiliki akses ke nama ini dan menimbulkan pengecualian
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
49

Pada panggilan kedua ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1, Anda memberikan kamus yang berbeda ke
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0. Dalam hal ini, kamus berisi kedua variabel,
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
52 dan
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
47, yang memungkinkan fungsi bekerja dengan benar. Namun, kali ini Anda tidak memiliki akses ke
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
42 setelah panggilan ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Mengapa?

Jika Anda memanggil

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dengan kamus
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0 yang tidak mengandung kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
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

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
5

Dalam contoh ini, Anda telah memberikan kamus kosong ke argumen

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0. Perhatikan bahwa
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 masih memiliki akses ke namespace bawaan karena namespace ini secara otomatis dimasukkan ke dalam kamus yang disediakan di bawah kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
59

Jika Anda memberikan nilai untuk argumen

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
1, maka itu bisa berupa objek apa saja. Objek pemetaan ini akan menampung namespace lokal saat
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menjalankan kode target Anda

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
6

Panggilan ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 tertanam dalam fungsi dalam contoh ini. Oleh karena itu, Anda memiliki cakupan global (tingkat modul) dan cakupan lokal (tingkat fungsi). Argumen
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
_0 memberikan nama
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
52 dari lingkup global, dan argumen
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
1 memberikan nama
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
47 dari lingkup lokal

Perhatikan bahwa setelah menjalankan

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
70, Anda tidak memiliki akses ke
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
42 karena nama ini dibuat di bawah cakupan lokal
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, yang tidak tersedia dari luar

Dengan argumen

>>> 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, Anda dapat men-tweak konteks di mana
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menjalankan kode Anda. Argumen ini cukup membantu untuk meminimalkan risiko keamanan yang terkait dengan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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 menanganinya

Mengungkap dan Meminimalkan Risiko Keamanan Di Balik >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)") >>> result 84 1

Seperti yang telah Anda pelajari sejauh ini,

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 adalah alat yang ampuh yang memungkinkan Anda mengeksekusi kode arbitrer yang datang kepada Anda sebagai string. Anda harus menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 dengan sangat hati-hati dan hati-hati karena kemampuannya untuk menjalankan kode apa pun

Biasanya, kode yang memberi makan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_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 memungkinkan

Namun, jika Anda harus menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 dalam kode Anda, maka pendekatan yang umumnya disarankan adalah menggunakannya dengan kamus
>>> 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 eksplisit

Masalah penting lainnya dengan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 mematahkan asumsi ini? . Kode baru ini mungkin sulit untuk diikuti, dipertahankan, atau bahkan dikontrol

Di bagian berikut, Anda akan mempelajari beberapa rekomendasi, teknik, dan praktik yang harus Anda terapkan jika Anda perlu menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dalam kode Anda

Hilangkan iklan

Menghindari Masukan Dari Sumber Tidak Tepercaya

Jika 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

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
89. Cuplikan kode ini mungkin akan menghapus semua konten disk server Anda, jadi jangan dijalankan

Untuk mencegah risiko ini, Anda dapat membatasi akses ke sistem

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
90 dengan memanfaatkan kamus
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0

>>> ________26______8

Sistem

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_90 secara internal menggunakan fungsi
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
93 bawaan. Jadi, jika Anda melarang akses ke namespace bawaan, maka sistem ________26______90 tidak akan berfungsi

Meskipun Anda dapat men-tweak kamus

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
_0 seperti yang ditunjukkan pada contoh di atas, satu hal yang tidak boleh Anda lakukan adalah menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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 ini

Membatasi >>> 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 Risiko

Anda dapat memberikan kamus khusus sebagai argumen

>>> 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 jika Anda ingin menyempurnakan akses ke nama global dan lokal saat menjalankan kode dengan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Misalnya, jika Anda memberikan kamus kosong ke
>>> 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, maka
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 tidak akan memiliki akses ke ruang nama global dan lokal Anda saat ini

>>>

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
9

Jika Anda memanggil

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dengan kamus kosong untuk
>>> 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, maka Anda melarang akses ke nama global dan lokal. Tweak ini memungkinkan Anda membatasi nama dan objek yang tersedia saat Anda menjalankan kode dengan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1

Namun, teknik ini tidak menjamin penggunaan yang aman dari

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Mengapa?

>>>

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
0

Dalam contoh ini, Anda menggunakan kamus kosong untuk

>>> 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, tetapi
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 masih dapat mengakses fungsi bawaan seperti
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
15,
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
16, dan
>>> exec("print('Hello, World!)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    File "<string>", line 1
      print('Hello, World!)
            ^
SyntaxError: unterminated string literal (detected at line 1)
6. Bagaimana Anda mencegah
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 mengakses nama bawaan?

Memutuskan Nama Bawaan yang Diizinkan

Seperti yang telah Anda pelajari, jika Anda meneruskan kamus khusus ke

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0 tanpa kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
59, Python akan secara otomatis memperbarui kamus itu dengan semua nama dalam cakupan bawaan di bawah kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
59 baru. Untuk membatasi perilaku implisit ini, Anda dapat menggunakan kamus
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0 yang berisi kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
59 dengan nilai yang sesuai

Misalnya, jika Anda ingin melarang akses ke nama bawaan sepenuhnya, Anda dapat memanggil

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 seperti pada contoh berikut

>>>

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
1

Dalam contoh ini, Anda menyetel

>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
_0 ke kamus khusus yang berisi kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
59 dengan kamus kosong sebagai nilai terkait. Praktik ini mencegah Python memasukkan referensi ke namespace bawaan ke
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0. Dengan cara ini, Anda memastikan bahwa
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 tidak akan memiliki akses ke nama bawaan saat mengeksekusi kode Anda

Anda juga dapat mengubah kunci

>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
_59 jika Anda memerlukan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk mengakses nama bawaan tertentu saja

>>>

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
2

Pada contoh pertama,

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 berhasil menjalankan kode input Anda karena
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
15 dan
>>> exec("print('Hello, World!)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    File "<string>", line 1
      print('Hello, World!)
            ^
SyntaxError: unterminated string literal (detected at line 1)
6 ada di kamus yang terkait dengan kunci
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
59. Dalam contoh kedua,
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 memunculkan
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
49 dan tidak menjalankan kode input Anda karena
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
16 tidak ada dalam
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
38 yang disediakan

Teknik dalam contoh di atas memungkinkan Anda meminimalkan implikasi keamanan penggunaan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Namun, teknik ini tidak sepenuhnya aman. Jadi, kapan pun Anda merasa perlu menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, coba pikirkan solusi lain yang tidak menggunakan fungsi tersebut

Hilangkan iklan

Menempatkan >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)") >>> result 84 _1 Menjadi Tindakan

Hingga saat ini, Anda telah mempelajari cara kerja fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 bawaan. Anda tahu bahwa Anda dapat menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 untuk menjalankan input berbasis string atau kode terkompilasi. Anda juga mengetahui bahwa fungsi ini dapat mengambil dua argumen opsional,
>>> 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, yang memungkinkan Anda mengubah namespace eksekusi untuk
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1

Selain itu, Anda telah belajar bahwa menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dalam kode Anda

Di bagian berikut, Anda akan membuat kode beberapa contoh praktis yang akan membantu Anda menemukan kasus penggunaan yang menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dapat sesuai

Menjalankan Kode Dari Sumber Eksternal

Menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk mengeksekusi kode yang datang sebagai string baik dari pengguna Anda atau sumber lain mungkin merupakan kasus penggunaan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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 tertentu

Anda tidak boleh menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 untuk menjalankan kode eksternal arbitrer pada mesin Anda, karena tidak ada cara yang aman untuk melakukannya. Jika Anda akan menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1, gunakan itu sebagai cara untuk membiarkan pengguna Anda menjalankan kode mereka sendiri di mesin mereka sendiri

Pustaka standar memiliki beberapa modul yang menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk mengeksekusi kode yang diberikan oleh pengguna sebagai string. Contoh yang baik adalah modul, yang awalnya ditulis sendiri oleh Guido van Rossum

Modul

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_55 menyediakan cara cepat untuk mengatur waktu potongan kecil kode Python yang datang sebagai string. Lihat contoh berikut dari dokumentasi modul

>>>

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
3

Fungsi

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_57 mengambil cuplikan kode sebagai string, menjalankan kode, dan mengembalikan pengukuran waktu eksekusi. Fungsi ini juga membutuhkan beberapa argumen lain. Misalnya,
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_58 memungkinkan Anda untuk memberikan berapa kali Anda ingin mengeksekusi kode target

Di jantung fungsi ini, Anda akan menemukan kelasnya.

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_59 menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk menjalankan kode yang disediakan. Jika Anda memeriksa kode sumber
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_59 di modul
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
55, maka Anda akan menemukan bahwa kelas ,
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
64, termasuk kode berikut

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_4

Panggilan ke

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 di baris yang disorot mengeksekusi kode pengguna menggunakan
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
66 dan
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
67 sebagai ruang nama global dan lokalnya

Cara menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_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 dijalankan

Contoh lain penggunaan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk menjalankan kode yang datang sebagai string adalah modul
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
70. Modul ini memeriksa docstring Anda untuk mencari teks yang terlihat seperti sesi interaktif Python. Jika
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70 menemukan teks seperti sesi interaktif, teks tersebut akan dieksekusi sebagai kode Python untuk memeriksa apakah berfungsi seperti yang diharapkan

Misalnya, Anda memiliki fungsi berikut untuk menjumlahkan dua angka

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_5

Dalam cuplikan kode ini,

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_72 mendefinisikan sebuah docstring dengan beberapa tes yang memeriksa bagaimana fungsi seharusnya bekerja. Perhatikan bahwa tes mewakili panggilan ke
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_72 dalam sesi interaktif hipotetis menggunakan jenis argumen yang valid dan tidak valid

Setelah Anda memiliki tes interaktif ini dan hasil yang diharapkan dalam dokumen Anda, maka Anda dapat menggunakan

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
70 untuk menjalankannya dan memeriksa apakah mereka mengeluarkan hasil yang diharapkan

Catatan. 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

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
75 Anda

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_6

Perintah 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

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70 menggunakan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk mengeksekusi kode yang disematkan docstring interaktif apa pun, seperti yang dapat Anda konfirmasikan dalam kode sumber modul

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_7

Seperti yang dapat Anda konfirmasikan dalam cuplikan kode ini, kode pengguna dijalankan dalam panggilan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, yang menggunakan
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
3 untuk mengompilasi kode target. Untuk menjalankan kode ini,
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 menggunakan
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
81 sebagai argumen
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
0. Perhatikan bahwa komentar tepat sebelum panggilan ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dengan bercanda menyatakan bahwa ini adalah tempat di mana kode pengguna dijalankan

Sekali lagi, dalam kasus penggunaan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_1 ini, tanggung jawab memberikan contoh kode aman ada pada pengguna. Pengelola
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70 tidak bertanggung jawab untuk memastikan bahwa panggilan ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 tidak menyebabkan kerusakan apa pun

Penting untuk dicatat bahwa

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70 tidak mencegah risiko keamanan yang terkait dengan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Dengan kata lain,
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70 akan menjalankan kode Python apa pun. Misalnya, seseorang dapat memodifikasi fungsi
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
72 Anda untuk menyertakan kode berikut dalam docstring

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_8

Jika Anda menjalankan

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70 pada file ini, maka perintah
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
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
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
93 atau perintah berbahaya lainnya

Sekali lagi, Anda harus selalu berhati-hati dengan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dan dengan alat yang menggunakan fungsi ini, seperti
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
70. Dalam kasus khusus
>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_70, selama Anda tahu dari mana asal kode pengujian yang disematkan, alat ini akan cukup aman dan berguna

Hilangkan iklan

Menggunakan Python untuk File Konfigurasi

Situasi lain di mana Anda dapat menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk membuat objek kamus yang berisi semua parameter konfigurasi Anda dan nilainya

Misalnya, Anda memiliki file konfigurasi berikut untuk aplikasi editor teks yang sedang Anda kerjakan

>>> numbers = [2, 3, 7, 4, 8]

>>> sum(number**2 for number in numbers if number % 2 == 0)
84
_9

File ini memiliki sintaks Python yang valid, sehingga Anda dapat menjalankan kontennya menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 seperti yang Anda lakukan dengan file
>>> while True:
..     exec(input("->> "))
...

->> print("Hello, World!")
Hello, World!

->> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
    ...

->> x = 10
->> if 1 <= x <= 10: print(f"{x} is between 1 and 10")
10 is between 1 and 10
11 biasa

Catatan. Anda akan menemukan beberapa cara yang lebih baik dan lebih aman untuk bekerja dengan file konfigurasi daripada menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Di pustaka standar Python, Anda memiliki modul, yang memungkinkan Anda memproses file konfigurasi yang menggunakan format file INI

Fungsi di bawah ini membaca file

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
_03 Anda dan membuat kamus konfigurasi

>>>

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
0

Fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
04 mengambil jalur ke file konfigurasi. Kemudian ia membaca file target sebagai teks dan meneruskan teks itu ke
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 untuk dieksekusi. Selama menjalankan
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1, fungsi memasukkan parameter konfigurasi ke dalam kamus
>>> exec("name = input('Your name: '); print(f'Hello, {name}!')")
Your name: Leodanis
Hello, Leodanis!
1, yang kemudian dikembalikan ke kode pemanggil

Catatan. Teknik di bagian ini mungkin merupakan kasus penggunaan yang aman dari

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1. Dalam contoh, Anda akan menjalankan aplikasi di sistem Anda, khususnya editor teks

Jika 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

Kesimpulan

Anda telah mempelajari cara menggunakan fungsi

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
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
>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dan kapan boleh menggunakan fungsi dalam kode Anda

Dalam tutorial ini, Anda telah mempelajari caranya

  • Bekerja dengan fungsi
    >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
    >>> result
    84
    
    1 bawaan Python
  • Gunakan
    >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
    >>> result
    84
    
    1 Python untuk menjalankan input berbasis string dan kode terkompilasi
  • Menilai dan meminimalkan risiko keamanan yang terkait dengan penggunaan
    >>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
    >>> result
    84
    
    1

Selain itu, Anda telah membuat kode beberapa contoh praktis yang membantu Anda lebih memahami kapan dan bagaimana menggunakan

>>> exec("result = sum(number**2 for number in numbers if number % 2 == 0)")
>>> result
84
1 dalam kode Python Anda

Kode 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

Dinamis untuk loop di python

Kirimi Saya Trik Python »

Tentang Leodanis Pozo Ramos

Dinamis untuk loop di python
Dinamis untuk loop di python

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 Leodanis


Setiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah

Dinamis untuk loop di python

Aldren

Dinamis untuk loop di python

Geir Arne

Dinamis untuk loop di python

Ian

Dinamis untuk loop di python

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
Dengan Akses Tak Terbatas ke Real Python

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 Email

Apa 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