Sebelum menjelaskan apa pun tentang if __name__ == '__main__'
itu, penting untuk memahami apa __name__
itu dan apa fungsinya.
Apa __name__
?
__name__
adalah DunderAlias - dapat dianggap sebagai variabel global (dapat diakses dari modul) dan berfungsi dengan cara yang mirip dengan global
.
Ini adalah string (global seperti yang disebutkan di atas) seperti yang ditunjukkan oleh type(__name__)
(menghasilkan <class 'str'>
), dan merupakan standar bawaan untuk versi Python 3 dan Python 2 .
Dimana:
Ini tidak hanya dapat digunakan dalam skrip tetapi juga dapat ditemukan di interpreter dan modul / paket.
Penerjemah:
>>> print(__name__)
__main__
>>>
Naskah:
test_file.py :
print(__name__)
Yang menghasilkan __main__
Modul atau paket:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Yang menghasilkan somefile
Perhatikan bahwa ketika digunakan dalam suatu paket atau modul, __name__
ambil nama file tersebut. Jalur modul atau paket sebenarnya tidak diberikan, tetapi memiliki DunderAlias sendiri __file__
, yang memungkinkan untuk ini.
Anda harus melihat bahwa, di mana __name__
, di mana file utama (atau program) akan selalu kembali __main__
, dan jika itu adalah modul / paket, atau apa pun yang menjalankan beberapa skrip Python lainnya, akan mengembalikan nama file di mana itu berasal dari.
Praktek:
Menjadi variabel berarti nilainya dapat ditimpa ("bisa" tidak berarti "harus"), menimpa nilai __name__
akan menghasilkan kurangnya keterbacaan. Jadi jangan lakukan itu, dengan alasan apa pun. Jika Anda membutuhkan variabel, tentukan variabel baru.
Itu selalu diasumsikan bahwa nilai __name__
menjadi __main__
atau nama file. Sekali lagi mengubah nilai default ini akan menyebabkan lebih banyak kebingungan bahwa itu akan berbuat baik, menyebabkan masalah lebih jauh ke depan.
contoh:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
Ini dianggap praktik yang baik secara umum untuk memasukkan if __name__ == '__main__'
skrip dalam.
Sekarang untuk menjawab if __name__ == '__main__'
:
Sekarang kita tahu perilaku __name__
menjadi lebih jelas:
Sebuah if
adalah pernyataan kontrol aliran yang berisi blok kode akan mengeksekusi jika nilai yang diberikan adalah benar. Kami telah melihatnya__name__
dapat mengambil salah satu
__main__
atau nama file dari mana ia diimpor.
Ini berarti bahwa jika __name__
sama dengan__main__
maka file tersebut harus file utama dan harus benar-benar berjalan (atau itu adalah juru bahasa), bukan modul atau paket yang diimpor ke dalam skrip.
Jika memang __name__
mengambil nilai__main__
maka apa pun yang ada di blok kode itu akan dijalankan.
Ini memberitahu kita bahwa jika file yang dijalankan adalah file utama (atau Anda menjalankan dari penerjemah secara langsung) maka syarat itu harus dijalankan. Jika itu sebuah paket maka seharusnya tidak, dan nilainya tidak akan __main__
.
Modul:
__name__
juga dapat digunakan dalam modul untuk menentukan nama modul
Varian:
Dimungkinkan juga untuk melakukan hal-hal lain yang kurang umum tetapi bermanfaat __name__
, beberapa akan saya tunjukkan di sini:
Hanya mengeksekusi jika file tersebut adalah modul atau paket:
if __name__ != '__main__':
# Do some useful things
Menjalankan satu kondisi jika file tersebut adalah yang utama dan yang lainnya jika tidak:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Anda juga dapat menggunakannya untuk menyediakan fungsi / utilitas bantuan yang dapat dijalankan pada paket dan modul tanpa penggunaan pustaka yang rumit.
Ini juga memungkinkan modul dijalankan dari baris perintah sebagai skrip utama, yang juga bisa sangat berguna.
if __name__ == "__main__":
kondisi blok sudah usang / usang sejauh Python 3? Saya telah menemukan beberapa informasi yang menyatakan itu.