Memahami jika __name__ == ‘__main__’ dengan Python

Dalam panduan ini, Anda akan memahami fungsionalitas dan pentingnya if __name__ == ‘__main__’ dengan Python.

Pernahkah Anda membaca sekilas basis kode Python dengan modul yang berbeda?

Jika ya, Anda mungkin akan menemukan jika __name__ == ‘__main__’ bersyarat dalam satu atau lebih modul. Selama beberapa menit berikutnya, kami akan mengungkap apa arti kondisional di atas dan melihat contoh yang dapat membantu.

Mari kita mulai!

Apa Signifikansi __name__ dengan Python?

Dalam Python, modul adalah file .py yang berisi definisi fungsi, serangkaian ekspresi yang akan dievaluasi, dan banyak lagi. Misalnya, jika kita memiliki file bernama hello_world.py, kita menyebutnya sebagai file hello_world.py atau modul hello_world.

Saat Anda menjalankan modul Python, interpreter Python menetapkan nilai untuk beberapa variabel khusus sebelum eksekusi: __name__ adalah salah satunya. Kunci untuk memahami signifikansi __name__ adalah memahami cara kerja impor dengan Python.

Unduh kode untuk bagian ini di sini.

Buka folder contoh-1. Kami memiliki file module1.py. Variabel __name__ berada di namespace modul saat ini.

Modul ini mencetak garis diikuti dengan nilai variabel __name__.

# example-1/module1.py
print("This is module1.")
print(f"The __name__ variable of module 1 is: {__name__}.")

Sekarang, mari kita jalankan module1 dari baris perintah.

$ python module1.py

Pada output, kita melihat bahwa variabel __name__ diatur ke __main__.

This is module1.
The __name__ variable of module 1 is: __main__.

Mengimpor Modul dengan Python

Selain menjalankan modul Python, terkadang Anda mungkin ingin menggunakan fungsionalitas dari modul Python lain di dalam modul saat ini. Python memfasilitasi ini melalui impor.

  Cara Menonaktifkan Google Analytics di Nintendo Switch eShop

Impor memungkinkan Anda menggunakan kembali fungsionalitas modul lain—dengan mengimpornya ke dalam cakupan modul saat ini—tanpa harus menulis ulang kode.

File module2.py berisi yang berikut ini. Kami telah mengimpor module1 di dalamnya. modul2.

# example-1/module2.py

import module1 # module1 is imported

print(f"This is module2")
print(f"The __name__ variable of module2 is: {__name__}.")

Kami menjalankan module2.py dan mengamati hasilnya.

$ python module2.py

Pada keluaran di bawah ini:

  • Kita melihat bahwa module1 dijalankan di bawah kap ketika kita mengimpornya di dalam module2, dan output yang sesuai dicetak.
  • Namun kali ini, variabel __name__ bukan __main__ melainkan module1.
  • Karena kita menjalankan module2 secara langsung, variabel __name__ yang sesuai dengan modul sekarang menjadi __main__.
Output

This is module1.
The __name__ variable of module 1 is: module1.
This is module2
The __name__ variable of module2 is: __main__.

Ide Kunci:

– Jika modul dijalankan secara langsung, variabel __name__-nya disetel sama dengan __main__.

– Jika sebuah modul diimpor ke dalam modul lain, __name__-nya disetel ke nama modul.

Contoh if __name__==’__main__’ dengan Python

Di bagian ini, kita akan melihat kasus penggunaan praktis dari if __name__ == ‘__main__’ conditional. Kami akan mendefinisikan fungsi sederhana dan kemudian menulis tes unit untuk memeriksa apakah fungsi tersebut berfungsi seperti yang diharapkan.

Unduh kodenya dan ikuti.

Kode untuk bagian ini dapat ditemukan di folder contoh-2.

Di sini, add.py adalah file Python yang berisi definisi fungsi add_ab(). Fungsi add_ab() mengambil dua angka dan mengembalikan jumlah mereka.

# example-2/add.py

def add_ab(a,b):
    return a + b

Kami akan menggunakan modul unittest Python untuk menguji fungsi add_ab().

Menulis Kasus Uji untuk Fungsi Python

Lihat cuplikan kode di bawah ini, yang berisi konten modul test_add.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)
    

Kode di atas melakukan hal berikut:

  • Mengimpor modul unittest bawaan Python
  • Mengimpor fungsi add_ab() dari modul add
  • Mendefinisikan kelas uji TestAdd dan satu set kasus uji sebagai metode dalam kelas uji
  Mengapa Beberapa Keyboard Memiliki Banyak Simbol Pada Beberapa Tombol?

Untuk menyiapkan pengujian unit untuk kode Anda, Anda harus terlebih dahulu menentukan kelas pengujian yang diturunkan dari unittest.TestCase. Semua kasus uji harus ditentukan sebagai metode di dalam kelas dan harus dimulai dengan test_.

Catatan: Jika Anda tidak menamai metode tersebut sebagai test_, Anda akan melihat bahwa pengujian terkait tidak akan terdeteksi, dan oleh karena itu, tidak akan berjalan.

Sekarang mari kita coba menjalankan modul test_add dari terminal.

$ python test_add.py

Anda akan melihat bahwa tidak ada output, dan tidak ada tes yang berjalan.

Mengapa demikian?

Ini karena untuk menjalankan tes unit, Anda harus menjalankan unittest sebagai modul utama saat menjalankan test_add.py, menggunakan perintah di bawah ini.

$ python -m unittest test_add.py

Setelah menjalankan perintah verbose di atas, kita melihat bahwa ketiga tes telah berjalan dengan sukses.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Namun, akan lebih mudah untuk menjalankan tes ketika modul test_add ini dijalankan, ya? Mari pelajari cara melakukannya di bagian selanjutnya.

Menggunakan if __name__ == ‘__main__’ untuk Menjalankan unittest sebagai Modul Utama

Jika Anda ingin menjalankan semua unit test saat modul berjalan secara langsung, Anda dapat menambahkan conditional.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)

# Run unittest as the main module
if __name__ == '__main__':
        unittest.main()

Kondisi dalam cuplikan kode di atas memberi tahu juru bahasa Python: Jika modul ini dijalankan secara langsung, maka jalankan kode di dalamnya. unittest.main().

  Baris Perintah: Mengapa Orang Masih Mengganggunya?

Anda dapat menjalankan modul test_add setelah menambahkan dua baris kode di atas.

$ python test_add.py

️ Menjalankan modul uji tambah secara langsung sekarang menjalankan ketiga pengujian yang telah kami tetapkan.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Output di atas OK menunjukkan bahwa semua tes berhasil dijalankan. Tiga titik … menunjukkan bahwa tiga tes dijalankan, dan semuanya lulus.

Sekarang, mari kita ubah nilai pengembalian yang diharapkan test_add_1_minus7 menjadi 8. Karena fungsi mengembalikan – 6 dalam kasus ini, seharusnya ada satu pengujian yang gagal.

def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), 8)

Seperti yang terlihat pada output di bawah, kita mendapatkan .F., dari tiga tes, pola salah satunya gagal (tes kedua), dan di traceback, kita mendapatkan AssertionError yang menyatakan – 6 != 8.

Output
.F.
======================================================================
FAIL: test_add_1_minus7 (__main__.TestAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_add.py", line 12, in test_add_1_minus7
    self.assertEqual(add_ab(1,-7), 8)
AssertionError: -6 != 8

----------------------------------------------------------------------
Ran 3 tests in 0.021s

FAILED (failures=1)

Satu hal penting yang perlu diperhatikan adalah bahwa tes tidak harus berjalan dalam urutan yang sama seperti yang ditentukan di kelas tes. Dalam contoh di atas, test_add_1_minus7 didefinisikan sebagai metode ketiga di kelas pengujian, tetapi pengujian terkait dijalankan kedua.

Menyimpulkan

Saya harap tutorial ini membantu Anda memahami bagaimana kondisi if __name__ == ‘__main__’ bekerja dengan Python.

Berikut rekap cepat dari takeaways utama:

  • Interpreter Python menyetel variabel __name__ sebelum mengeksekusi skrip Python.
  • Saat Anda menjalankan modul secara langsung, nilai __name__ adalah __main__.
  • Saat Anda mengimpor modul di dalam skrip Python lain, nilai __name__ adalah nama modul.
  • Anda dapat menggunakan if __name__ == ‘__main__’ untuk mengontrol eksekusi dan bagian mana dari modul yang dijalankan masing-masing selama proses langsung dan impor.

Selanjutnya, lihat panduan mendalam ini tentang set Python. Selamat belajar!