Dengan kode berikut, apa fungsinya if __name__ == "__main__":
?
# Threading example
import time, thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
python
namespaces
main
python-module
idioms
Berbakti
sumber
sumber
if __name__ == "__main__":
kondisi blok sudah usang / usang sejauh Python 3? Saya telah menemukan beberapa informasi yang menyatakan itu.Jawaban:
Setiap kali penerjemah Python membaca file sumber, itu melakukan dua hal:
itu menetapkan beberapa variabel khusus seperti
__name__
, dan kemudianitu mengeksekusi semua kode yang ditemukan dalam file.
Mari kita lihat bagaimana ini bekerja dan bagaimana kaitannya dengan pertanyaan Anda tentang
__name__
pemeriksaan yang selalu kita lihat dalam skrip Python.Contoh kode
Mari kita gunakan contoh kode yang sedikit berbeda untuk mengeksplorasi cara kerja impor dan skrip. Misalkan berikut ini dalam file bernama
foo.py
.Variabel khusus
Ketika interpeter Python membaca file sumber, ia pertama-tama mendefinisikan beberapa variabel khusus. Dalam hal ini, kami peduli dengan
__name__
variabelnya.Ketika Modul Anda Adalah Program Utama
Jika Anda menjalankan modul Anda (file sumber) sebagai program utama, mis
interpreter akan menetapkan string hard-coded
"__main__"
ke__name__
variabel, yaituKetika Modul Anda Diimpor Oleh Orang Lain
Di sisi lain, anggaplah beberapa modul lain adalah program utama dan itu mengimpor modul Anda. Ini berarti ada pernyataan seperti ini di program utama, atau di modul lain, program ini mengimpor:
Penerjemah akan mencari
foo.py
file Anda (bersama dengan mencari beberapa varian lainnya), dan sebelum menjalankan modul itu, ia akan menetapkan nama"foo"
dari pernyataan impor ke__name__
variabel, yaituMelaksanakan Kode Modul
Setelah variabel khusus diatur, penerjemah mengeksekusi semua kode dalam modul, satu pernyataan pada satu waktu. Anda mungkin ingin membuka jendela lain di samping dengan contoh kode sehingga Anda dapat mengikuti penjelasan ini.
Selalu
Ini mencetak string
"before import"
(tanpa tanda kutip).Itu memuat
math
modul dan menugaskannya ke variabel yang disebutmath
. Ini sama dengan menggantiimport math
dengan yang berikut ini (perhatikan bahwa__import__
ini adalah fungsi tingkat rendah dalam Python yang mengambil string dan memicu impor aktual):Ini mencetak string
"before functionA"
.Ini mengeksekusi
def
blok, membuat objek fungsi, kemudian menetapkan objek fungsi itu ke variabel yang disebutfunctionA
.Ini mencetak string
"before functionB"
.Itu mengeksekusi
def
blok kedua , membuat objek fungsi lain, kemudian menugaskannya ke variabel yang dipanggilfunctionB
.Ini mencetak string
"before __name__ guard"
.Hanya Ketika Modul Anda Adalah Program Utama
__name__
memang diatur ke"__main__"
dan memanggil dua fungsi, mencetak string"Function A"
dan"Function B 10.0"
.Hanya Saat Modul Anda Diimpor oleh Orang Lain
__name__
akan menjadi"foo"
, bukan"__main__"
, dan itu akan melewati badanif
pernyataan.Selalu
"after __name__ guard"
di kedua situasi.Ringkasan
Singkatnya, inilah yang akan dicetak dalam dua kasus:
Mengapa Ini Bekerja Dengan Cara Ini?
Anda mungkin bertanya-tanya mengapa ada orang yang menginginkan ini. Nah, terkadang Anda ingin menulis
.py
file yang bisa digunakan oleh program lain dan / atau modul sebagai modul, dan juga bisa dijalankan sebagai program utama itu sendiri. Contoh:Modul Anda adalah pustaka, tetapi Anda ingin memiliki mode skrip tempat menjalankan beberapa tes unit atau demo.
Modul Anda hanya digunakan sebagai program utama, tetapi memiliki beberapa pengujian unit, dan kerangka kerja pengujian bekerja dengan mengimpor
.py
file seperti skrip Anda dan menjalankan fungsi pengujian khusus. Anda tidak ingin itu mencoba menjalankan skrip hanya karena mengimpor modul.Modul Anda sebagian besar digunakan sebagai program utama, tetapi juga menyediakan API yang ramah programmer untuk pengguna tingkat lanjut.
Di luar contoh-contoh itu, elegan bahwa menjalankan skrip dengan Python hanya menyiapkan beberapa variabel ajaib dan mengimpor skrip. "Menjalankan" skrip adalah efek samping dari mengimpor modul skrip.
Bahan untuk dipikirkan
Pertanyaan: Dapatkah saya memiliki beberapa
__name__
blok pemeriksaan? Jawaban: aneh melakukannya, tetapi bahasa tidak akan menghentikan Anda.Misalkan berikut ini dalam
foo2.py
. Apa yang terjadi jika Anda mengatakanpython foo2.py
pada command-line? Mengapa?__name__
check-infoo3.py
:sumber
subprocess.run('foo_bar.py')
skrip python? Saya kira itufoo_bar
akan dimulai dengan__name__ = '__main__'
seperti ketika saya mengetikkanfoo_bar.py
cmd secara manual. Apakah itu masalahnya? Mempertimbangkan Jawab @MrFooz 'seharusnya tidak ada masalah dalam melakukan ini dan memiliki modul "utama" sebanyak yang saya mau. Bahkan mengubah__name__
nilai atau memiliki beberapa contoh yang dibuat secara independen (atau contoh yang dibuat oleh satu sama lainsubprocess
) berinteraksi satu sama lain harus menjadi bisnis seperti biasa untuk Python. Apakah saya melewatkan sesuatu?subprocess.run
. Oleh karena itu, cara berbagi kode antar skrip yang umumnya lebih baik adalah dengan membuat modul dan meminta skrip memanggil modul yang dibagikan daripada saling memanggil sebagai skrip. Sulit untuk men-debugsubprocess.run
panggilan karena sebagian besar debugger tidak melewati batas proses, itu dapat menambah overhead sistem non-sepele untuk membuat dan menghancurkan proses tambahan, dll.from foo2 import functionB
mengimpor foo2 dari functionB? Itu liuk semantik.from module import method
mengimpor metode dari modul.multiprocessing
, khususnya membuat tes ini diperlukan pada Windows.Saat skrip Anda dijalankan dengan meneruskannya sebagai perintah ke juru bahasa Python,
semua kode yang berada pada level lekukan 0 dijalankan. Fungsi dan kelas yang didefinisikan adalah, well, terdefinisi, tetapi tidak ada kodenya yang dijalankan. Tidak seperti bahasa lain, tidak ada
main()
fungsi yang dijalankan secara otomatis -main()
fungsi ini secara implisit semua kode di tingkat atas.Dalam hal ini, kode tingkat atas adalah
if
blok.__name__
adalah variabel bawaan yang mengevaluasi nama modul saat ini. Namun, jika modul dijalankan langsung (seperti dimyscript.py
atas), maka__name__
alih-alih diatur ke string"__main__"
. Dengan demikian, Anda dapat menguji apakah skrip Anda dijalankan secara langsung atau diimpor oleh sesuatu yang lain dengan pengujianJika skrip Anda sedang diimpor ke modul lain, berbagai fungsi dan definisi kelasnya akan diimpor dan kode tingkat atasnya akan dieksekusi, tetapi kode di badan
if
klausa di atas tidak akan berjalan karena kondisinya tidak bertemu. Sebagai contoh dasar, pertimbangkan dua skrip berikut:Sekarang, jika Anda memanggil penerjemah sebagai
Outputnya adalah
Jika Anda menjalankan
two.py
sebaliknya:Anda mendapatkan
Jadi, ketika modul
one
dimuat, hasilnya__name__
sama dengan"one"
bukan"__main__"
.sumber
Penjelasan paling sederhana untuk
__name__
variabel (imho) adalah sebagai berikut:Buat file berikut.
dan
Menjalankan mereka akan memberi Anda hasil ini:
Seperti yang Anda lihat, ketika modul diimpor, Python menetapkan
globals()['__name__']
modul ini ke nama modul. Juga, setelah mengimpor semua kode dalam modul sedang dijalankan. Sebagaiif
mengevaluasi pernyataan untukFalse
bagian ini tidak dijalankan.Seperti yang Anda lihat, ketika sebuah file dieksekusi, Python menetapkan
globals()['__name__']
file ini ke"__main__"
. Kali ini,if
pernyataan dievaluasi untukTrue
dan sedang dijalankan.sumber
Untuk menguraikan dasar-dasarnya:
Variabel global
__name__
,, dalam modul yang merupakan titik masuk ke program Anda, adalah'__main__'
. Kalau tidak, itu nama tempat Anda mengimpor modul.Jadi, kode di bawah
if
blok hanya akan berjalan jika modul adalah titik masuk ke program Anda.Ini memungkinkan kode dalam modul dapat diimpor oleh modul lain, tanpa mengeksekusi blok kode di bawah impor.
Mengapa kita memerlukan ini?
Mengembangkan dan Menguji Kode Anda
Katakanlah Anda sedang menulis skrip Python yang dirancang untuk digunakan sebagai modul:
Anda dapat menguji modul dengan menambahkan panggilan fungsi ini ke bawah:
dan menjalankannya (pada prompt perintah) dengan sesuatu seperti:
Masalah
Namun, jika Anda ingin mengimpor modul ke skrip lain:
Pada impor,
do_important
fungsi akan dipanggil, jadi Anda mungkin akan mengomentari panggilan fungsi Andado_important()
,, di bagian bawah.Dan kemudian Anda harus ingat apakah Anda sudah mengomentari panggilan fungsi pengujian atau tidak. Dan kompleksitas ekstra ini berarti Anda cenderung lupa, membuat proses pengembangan Anda lebih menyusahkan.
A Better Way
The
__name__
variabel poin ke namespace mana pun interpreter Python terjadi menjadi saat ini.Di dalam modul yang diimpor, itu adalah nama modul itu.
Tetapi di dalam modul utama (atau sesi Python interaktif, yaitu Baca, Eval, Loop Cetak, atau REPL penerjemah) Anda menjalankan semuanya dari itu
"__main__"
.Jadi, jika Anda memeriksa sebelum mengeksekusi:
Dengan kode di atas, kode Anda hanya akan dieksekusi ketika Anda menjalankannya sebagai modul utama (atau dengan sengaja menyebutnya dari skrip lain).
Suatu Cara Yang Lebih Baik
Ada cara Pythonic untuk memperbaiki ini, meskipun.
Bagaimana jika kita ingin menjalankan proses bisnis ini dari luar modul?
Jika kita meletakkan kode yang ingin kita gunakan saat kita mengembangkan dan menguji dalam fungsi seperti ini dan kemudian melakukan pemeriksaan untuk
'__main__'
segera setelah:Kami sekarang memiliki fungsi akhir untuk akhir modul kami yang akan berjalan jika kami menjalankan modul sebagai modul utama.
Ini akan memungkinkan modul dan fungsinya dan kelas untuk diimpor ke skrip lain tanpa menjalankan
main
fungsi, dan juga akan memungkinkan modul (dan fungsi dan kelasnya) dipanggil ketika menjalankan dari'__main__'
modul yang berbeda , yaituUngkapan ini juga dapat ditemukan dalam dokumentasi Python dalam penjelasan
__main__
modul. Teks itu menyatakan:sumber
if __name__ == "__main__"
adalah bagian yang berjalan ketika skrip dijalankan dari (katakanlah) baris perintah menggunakan perintah likepython myscript.py
.sumber
helloworld.py
dengan hanyaprint("hello world")
di dalamnya dapat berjalan dengan perintahpython helloworld.py
bahkan ketika tidak adaif __name__ == "__main__"
?__name__
adalah variabel global (dalam Python, global sebenarnya berarti pada tingkat modul ) yang ada di semua ruang nama. Biasanya nama modul (sebagaistr
tipe).Namun, sebagai satu-satunya kasus khusus, dalam proses Python apa pun yang Anda jalankan, seperti pada mycode.py:
namespace global yang anonim diberikan nilai
'__main__'
ke__name__
.Jadi, termasuk baris terakhir
akan menyebabkan
main
fungsi skrip Anda yang unik berjalan.Manfaat lain menggunakan konstruk ini: Anda juga dapat mengimpor kode Anda sebagai modul di skrip lain dan kemudian menjalankan fungsi utama jika dan ketika program Anda memutuskan:
sumber
Ada banyak perbedaan di sini tentang mekanisme kode yang dimaksud, "Bagaimana", tetapi bagi saya tidak ada yang masuk akal sampai saya memahami "Mengapa". Ini harus sangat membantu bagi programmer baru.
Ambil file "ab.py":
Dan file kedua "xy.py":
Ketika Anda mengeksekusi
xy.py
, Andaimport ab
. Pernyataan impor menjalankan modul segera pada impor, sehinggaab
operasi dapat dijalankan sebelum sisa darixy
. Setelah selesai denganab
, dilanjutkan denganxy
.Interpreter melacak skrip mana yang berjalan
__name__
. Saat Anda menjalankan skrip - tidak peduli apa yang Anda beri nama - penerjemah menyebutnya"__main__"
, menjadikannya skrip master atau 'home' yang akan dikembalikan setelah menjalankan skrip eksternal.Setiap skrip lain yang dipanggil dari
"__main__"
skrip ini akan diberi nama file sebagai__name__
(mis.,__name__ == "ab.py"
). Karena itu, garisif __name__ == "__main__":
adalah tes juru bahasa untuk menentukan apakah itu menafsirkan / menguraikan skrip 'rumah' yang awalnya dieksekusi, atau jika sementara mengintip ke skrip lain (eksternal). Ini memberikan fleksibilitas kepada programmer untuk membuat skrip berperilaku berbeda jika dijalankan secara langsung vs. disebut secara eksternal.Mari kita melangkahi kode di atas untuk memahami apa yang terjadi, dengan fokus pertama pada baris yang tidak terindentasi dan urutan yang muncul dalam skrip. Ingatlah bahwa fungsi - atau
def
- blok tidak melakukan apa pun sampai mereka dipanggil. Apa yang penerjemah katakan jika bergumam sendiri:"__main__"
dalam__name__
variabel.__name__ == "ab.py"
.a()
; Saya baru tahu itu. Mencetak ' Fungsi dalam file ab '."__main__"
!x()
; ok, mencetak ' tugas sampingan: mungkin berguna di proyek lain '.if
pernyataan. Nah, kondisinya telah terpenuhi (variabel__name__
telah diatur ke"__main__"
), jadi saya akan memasukkanmain()
fungsi dan mencetak ' fungsi utama: ini adalah tempat tindakan '.Dua baris bawah berarti: "Jika ini adalah
"__main__"
skrip atau 'rumah', jalankan fungsi yang disebutmain()
". Itu sebabnya Anda akan melihatdef main():
blok di bagian atas, yang berisi aliran utama fungsi skrip.Ingat apa yang saya katakan sebelumnya tentang pernyataan impor? Ketika Anda mengimpor modul, modul itu tidak hanya 'mengenalinya' dan menunggu instruksi lebih lanjut - modul ini benar-benar menjalankan semua operasi yang dapat dieksekusi yang terdapat dalam skrip. Jadi, menempatkan daging skrip Anda ke dalam
main()
fungsi secara efektif mengkarantina, menempatkannya dalam isolasi sehingga tidak akan langsung berjalan ketika diimpor oleh skrip lain.Sekali lagi, akan ada pengecualian, tetapi praktik umum yang
main()
biasanya tidak dipanggil secara eksternal. Jadi Anda mungkin bertanya-tanya satu hal lagi: jika kita tidak meneleponmain()
, mengapa kita memanggil skrip sama sekali? Itu karena banyak orang menyusun skrip mereka dengan fungsi mandiri yang dibangun untuk dijalankan secara independen dari sisa kode dalam file. Mereka kemudian dipanggil di tempat lain di tubuh skrip. Yang membawa saya ke ini:Ya itu betul. Fungsi-fungsi terpisah ini dapat dipanggil dari skrip in-line yang tidak terdapat di dalam a
main()
fungsi. Jika Anda terbiasa (seperti saya, dalam tahap awal pembelajaran saya pemrograman) untuk membangun skrip in-line yang melakukan persis apa yang Anda butuhkan, dan Anda akan mencoba mencari tahu lagi jika Anda memerlukan operasi itu lagi .. Nah, Anda tidak terbiasa dengan struktur internal semacam ini untuk kode Anda, karena lebih rumit untuk dibangun dan tidak intuitif untuk dibaca.Tapi itu skrip yang mungkin tidak dapat memiliki fungsi yang disebut eksternal, karena jika itu akan segera mulai menghitung dan menetapkan variabel. Dan kemungkinannya adalah jika Anda mencoba menggunakan kembali suatu fungsi, skrip baru Anda terkait cukup dekat dengan yang lama sehingga akan ada variabel yang saling bertentangan.
Dalam membagi fungsi independen, Anda memperoleh kemampuan untuk menggunakan kembali pekerjaan sebelumnya dengan memanggilnya ke skrip lain. Misalnya, "example.py" mungkin mengimpor "xy.py" dan menelepon
x()
, memanfaatkan fungsi 'x' dari "xy.py". (Mungkin menggunakan huruf ketiga dari string teks yang diberikan; membuat array NumPy dari daftar angka dan mengkuadratkannya, atau menghilangkan permukaan 3D. Kemungkinannya tidak terbatas.)(Sebagai tambahan, pertanyaan ini berisi jawaban oleh @kindall yang akhirnya membantu saya untuk memahami - mengapa, bukan bagaimana. Sayangnya itu telah ditandai sebagai duplikat dari yang ini , yang saya pikir merupakan kesalahan.)
sumber
Ketika ada pernyataan tertentu dalam modul kami (
M.py
) kami ingin dieksekusi ketika itu akan berjalan sebagai utama (tidak diimpor), kami dapat menempatkan pernyataan tersebut (uji kasus, pernyataan cetak) di bawahif
blok ini .Secara default (ketika modul berjalan sebagai utama, tidak diimpor)
__name__
variabel diatur ke"__main__"
, dan ketika akan diimpor__name__
variabel akan mendapatkan nilai yang berbeda, kemungkinan besar nama modul ('M'
). Ini sangat membantu dalam menjalankan varian modul yang berbeda secara bersamaan, dan memisahkan pernyataan input & output spesifik mereka dan juga jika ada kasus uji.Singkatnya , gunakan
if __name__ == "main"
blok ' ' ini untuk mencegah kode (tertentu) dijalankan ketika modul diimpor.sumber
Sederhananya,
__name__
adalah variabel yang ditentukan untuk setiap skrip yang mendefinisikan apakah skrip sedang dijalankan sebagai modul utama atau sedang dijalankan sebagai modul yang diimpor.Jadi jika kita memiliki dua skrip;
dan
Output dari mengeksekusi script1 adalah
Dan output dari mengeksekusi script2 adalah:
Seperti yang Anda lihat,
__name__
beri tahu kami kode mana yang merupakan modul 'utama'. Ini bagus, karena Anda hanya bisa menulis kode dan tidak perlu khawatir tentang masalah struktural seperti di C / C ++, di mana, jika file tidak menerapkan fungsi 'utama' maka tidak dapat dikompilasi sebagai yang dapat dieksekusi dan jika itu, maka tidak dapat digunakan sebagai perpustakaan.Katakanlah Anda menulis skrip Python yang melakukan sesuatu yang hebat dan Anda mengimplementasikan sejumlah fungsi yang berguna untuk tujuan lain. Jika saya ingin menggunakannya, saya hanya dapat mengimpor skrip Anda dan menggunakannya tanpa menjalankan program Anda (mengingat bahwa kode Anda hanya dieksekusi dalam
if __name__ == "__main__":
konteks). Sedangkan dalam C / C ++ Anda harus membagi bagian-bagian itu ke dalam modul terpisah yang kemudian menyertakan file. Bayangkan situasi di bawah ini;Panah adalah tautan impor. Untuk tiga modul masing-masing berusaha memasukkan kode modul sebelumnya ada enam file (sembilan, menghitung file implementasi) dan lima tautan. Ini membuatnya sulit untuk memasukkan kode lain ke dalam proyek C kecuali jika dikompilasi secara khusus sebagai perpustakaan. Sekarang gambarkan untuk Python:
Anda menulis modul, dan jika seseorang ingin menggunakan kode Anda, mereka hanya mengimpornya dan
__name__
variabel dapat membantu memisahkan bagian program yang dapat dieksekusi dari bagian perpustakaan.sumber
Mari kita lihat jawabannya dengan cara yang lebih abstrak:
Misalkan kita memiliki kode ini di
x.py
:Blok A dan B dijalankan ketika kita menjalankan
x.py
.Tapi hanya blok A (dan bukan B) dijalankan ketika kita menjalankan modul lain,
y.py
misalnya, di manax.py
diimpor dan kode dijalankan dari sana (seperti ketika fungsi dix.py
dipanggil dariy.py
).sumber
Ketika Anda menjalankan Python secara interaktif,
__name__
variabel lokal diberi nilai__main__
. Demikian juga, ketika Anda menjalankan modul Python dari baris perintah, alih-alih mengimpornya ke modul lain,__name__
atributnya diberi nilai__main__
, bukan nama sebenarnya dari modul. Dengan cara ini, modul dapat melihat__name__
nilainya sendiri untuk menentukan sendiri bagaimana mereka digunakan, apakah sebagai dukungan untuk program lain atau sebagai aplikasi utama yang dieksekusi dari baris perintah. Dengan demikian, idiom berikut cukup umum dalam modul Python:sumber
Mempertimbangkan:
Ia memeriksa apakah
__name__
atribut skrip Python adalah"__main__"
. Dengan kata lain, jika program itu sendiri dieksekusi, atributnya akan__main__
, sehingga program tersebut akan dieksekusi (dalam hal ini themain()
fungsinya).Namun, jika skrip Python Anda digunakan oleh modul, kode apa pun di luar
if
pernyataan akan dieksekusi, jadiif \__name__ == "\__main__"
digunakan hanya untuk memeriksa apakah program digunakan sebagai modul atau tidak, dan karena itu memutuskan apakah akan menjalankan kode.sumber
Sebelum menjelaskan apa pun tentang
if __name__ == '__main__'
itu, penting untuk memahami apa__name__
itu dan apa fungsinya.__name__
adalah DunderAlias - dapat dianggap sebagai variabel global (dapat diakses dari modul) dan berfungsi dengan cara yang mirip denganglobal
.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 .Ini tidak hanya dapat digunakan dalam skrip tetapi juga dapat ditemukan di interpreter dan modul / paket.
Penerjemah:
Naskah:
test_file.py :
Yang menghasilkan
__main__
Modul atau paket:
somefile.py:
test_file.py:
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.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:
Ini dianggap praktik yang baik secara umum untuk memasukkan
if __name__ == '__main__'
skrip dalam.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__
.__name__
juga dapat digunakan dalam modul untuk menentukan nama modulDimungkinkan 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:
Menjalankan satu kondisi jika file tersebut adalah yang utama dan yang lainnya jika tidak:
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.
sumber
Saya pikir yang terbaik adalah memecahkan jawaban secara mendalam dan dengan kata-kata sederhana:
__name__
: Setiap modul dengan Python memiliki atribut khusus yang disebut__name__
. Ini adalah variabel bawaan yang mengembalikan nama modul.__main__
: Seperti bahasa pemrograman lain, Python juga memiliki titik masuk eksekusi, yaitu utama.'__main__'
adalah nama ruang lingkup di mana kode tingkat atas dijalankan . Pada dasarnya Anda memiliki dua cara menggunakan modul Python: Jalankan secara langsung sebagai skrip, atau impor. Saat modul dijalankan sebagai skrip, modul__name__
ini disetel ke__main__
.Dengan demikian, nilai
__name__
atribut diatur ke__main__
saat modul dijalankan sebagai program utama. Kalau tidak, nilai__name__
diatur untuk berisi nama modul.sumber
Ini khusus untuk ketika file Python dipanggil dari baris perintah. Ini biasanya digunakan untuk memanggil fungsi "main ()" atau menjalankan kode startup lain yang sesuai, seperti argumen commandline yang menangani misalnya.
Itu bisa ditulis dalam beberapa cara. Lainnya adalah:
Saya tidak mengatakan Anda harus menggunakan ini dalam kode produksi, tetapi ini berfungsi untuk menggambarkan bahwa tidak ada yang "ajaib" tentang itu
if __name__ == '__main__'
. Ini adalah konvensi yang bagus untuk menjalankan fungsi utama dalam file Python.sumber
and
.and
digunakan untuk memeriksa apakah dua pernyataan boolean keduanya benar. Karena Anda tidak tertarik pada hasil dariand
,if
pernyataan yang lebih jelas mengomunikasikan niat Anda.Ada sejumlah variabel yang disediakan oleh sistem (juru bahasa Python) untuk file sumber (modul). Anda bisa mendapatkan nilainya kapan saja, jadi, izinkan kami fokus pada __name__ variabel / atribut :
Ketika Python memuat file kode sumber, ia mengeksekusi semua kode yang ditemukan di dalamnya. (Perhatikan bahwa ia tidak memanggil semua metode dan fungsi yang didefinisikan dalam file, tetapi ia mendefinisikannya.)
Namun, sebelum penerjemah mengeksekusi file kode sumber, ia mendefinisikan beberapa variabel khusus untuk file itu; __nama__ adalah salah satu variabel khusus yang didefinisikan secara otomatis oleh Python untuk setiap file kode sumber.
Jika Python memuat file kode sumber ini sebagai program utama (yaitu file yang Anda jalankan), maka ia menetapkan variabel __name__ khusus untuk file ini untuk memiliki nilai "__main__" .
Jika ini sedang diimpor dari modul lain, __name__ akan diatur ke nama modul itu.
Jadi, dalam contoh Anda sebagian:
berarti bahwa blok kode:
akan dieksekusi hanya ketika Anda menjalankan modul secara langsung; blok kode tidak akan dijalankan jika modul lain memanggil / mengimpornya karena nilai __name__ tidak akan sama dengan " main " dalam contoh khusus itu.
Semoga ini bisa membantu.
sumber
if __name__ == "__main__":
pada dasarnya adalah lingkungan skrip tingkat atas, dan menetapkan juru bahasa bahwa ('Saya memiliki prioritas tertinggi untuk dieksekusi terlebih dahulu').'__main__'
adalah nama ruang lingkup di mana kode tingkat atas dijalankan. Modul__name__
diatur sama dengan'__main__'
ketika dibaca dari input standar, skrip, atau dari prompt interaktif.sumber
Saya telah membaca banyak sekali jawaban di halaman ini. Saya akan mengatakan, jika Anda mengetahui hal itu, pasti Anda akan mengerti jawaban itu, jika tidak, Anda masih bingung.
Singkatnya, Anda perlu tahu beberapa hal:
import a
action sebenarnya menjalankan semua yang bisa dijalankan dalam "a"Karena poin 1, Anda mungkin tidak ingin semuanya dijalankan dalam "a" saat mengimpornya
Untuk mengatasi masalah di poin 2, python memungkinkan Anda untuk melakukan pemeriksaan kondisi
__name__
merupakan variabel implisit dalam semua.py
modul; saata.py
diimpor, nilai__name__
daria.py
modul diatur untuk nama file-nya "a
"; ketikaa.py
dijalankan langsung menggunakan "python a.py
", yang berartia.py
adalah entry point, maka nilai__name__
daria.py
modul diatur ke string__main__
Berdasarkan mekanisme bagaimana python mengatur variabel
__name__
untuk setiap modul, apakah Anda tahu cara mencapai poin 3? Jawabannya cukup mudah, bukan? Masukan kondisi jika:if __name__ == "__main__": ...
; Anda bahkan dapat menaruh jika__name__ == "a"
tergantung pada kebutuhan fungsional AndaHal penting yang menjadi istimewa python adalah poin 4! Sisanya hanya logika dasar.
sumber
Mempertimbangkan:
Output untuk di atas adalah
__main__
.Pernyataan di atas benar dan mencetak "metode langsung" . Misalkan jika mereka mengimpor kelas ini di kelas lain itu tidak mencetak "metode langsung" karena, saat mengimpor, itu akan ditetapkan
__name__ equal to "first model name"
.sumber
fibo.py (nama modul
fibo
)Referensi: https://docs.python.org/3.5/tutorial/modules.html
sumber
Alasan untuk
terutama untuk menghindari masalah kunci impor yang akan timbul dari memiliki kode yang diimpor secara langsung . Anda ingin
main()
menjalankan jika file Anda secara langsung dipanggil (itu yang__name__ == "__main__"
terjadi), tetapi jika kode Anda diimpor maka importir harus memasukkan kode Anda dari modul utama yang benar untuk menghindari masalah kunci impor.Efek sampingnya adalah Anda secara otomatis masuk ke metodologi yang mendukung banyak titik masuk. Anda dapat menjalankan program Anda menggunakan
main()
sebagai titik masuk, tetapi Anda tidak harus melakukannya . Saatsetup.py
mengharapkanmain()
, alat lain menggunakan titik masuk alternatif. Misalnya, untuk menjalankan file Anda sebagai suatugunicorn
proses, Anda mendefinisikan suatuapp()
fungsi alih-alih amain()
. Seperti halnyasetup.py
,gunicorn
impor kode Anda sehingga Anda tidak ingin melakukan apa-apa saat sedang diimpor (karena masalah kunci impor).sumber
Jawaban ini untuk programmer Java yang belajar Python. Setiap file Java biasanya berisi satu kelas publik. Anda dapat menggunakan kelas itu dalam dua cara:
Panggil kelas dari file lain. Anda hanya perlu mengimpornya di program panggilan.
Jalankan kelas berdiri sendiri, untuk tujuan pengujian.
Untuk kasus terakhir, kelas harus berisi metode public void main () statis. Dalam Python tujuan ini dilayani oleh label yang didefinisikan secara global
'__main__'
.sumber
Kode di bawah
if __name__ == '__main__':
hanya akan dieksekusi jika modul dipanggil sebagai skrip .Sebagai contoh, pertimbangkan modul berikut
my_test_module.py
:Kemungkinan 1: Impor
my_test_module.py
dalam modul lainSekarang jika Anda memohon
main.py
:Perhatikan bahwa hanya
print()
pernyataan tingkat atas dimy_test_module
dieksekusi.Kemungkinan kedua: Aktifkan
my_test_module.py
sebagai skripSekarang jika Anda menjalankan
my_test_module.py
sebagai skrip Python, keduaprint()
pernyataan tersebut akan dikecualikan:sumber
Setiap modul dalam python memiliki atribut yang disebut
__name__
. Nilai__name__
atribut adalah__main__
ketika modul dijalankan secara langsung, sepertipython my_module.py
. Kalau tidak (seperti ketika Anda mengatakanimport my_module
) nilai__name__
adalah nama modul.Contoh kecil untuk dijelaskan secara singkat.
Kami dapat menjalankan ini secara langsung sebagai
Keluaran
Sekarang anggaplah kita memanggil skrip di atas dari skrip lain
Ketika Anda menjalankan ini
Keluaran
Jadi, di atas cukup jelas bahwa ketika Anda memanggil tes dari skrip lain, jika loop
__name__
intest.py
tidak akan dijalankan.sumber
Jika file .py ini diimpor oleh file .py lainnya, kode di bawah "pernyataan jika" tidak akan dieksekusi.
Jika .py ini dijalankan oleh di
python this_py.py
bawah shell, atau klik dua kali pada Windows. kode di bawah "pernyataan jika" akan dieksekusi.Biasanya ditulis untuk pengujian.
sumber
Jika interpreter python menjalankan modul tertentu maka
__name__
variabel global akan memiliki nilai"__main__"
Saat Anda menjalankan skrip ini, Anda dapat melihat saya
Sebuah
Jika Anda mengimpor file ini, katakan A ke file B dan jalankan file B maka
if __name__ == "__main__"
dalam file A menjadi salah, sehingga ia mencetak Anda tidak dapat melihat sayab
sumber
Semua jawaban sudah cukup menjelaskan fungsionalitasnya. Tetapi saya akan memberikan satu contoh penggunaannya yang mungkin membantu membersihkan konsep lebih lanjut.
Asumsikan bahwa Anda memiliki dua file Python, a.py dan b.py. Sekarang, a.py mengimpor b.py. Kami menjalankan file a.py, tempat kode "import b.py" dijalankan terlebih dahulu. Sebelum sisa kode a.py berjalan, kode dalam file b.py harus berjalan sepenuhnya.
Dalam kode b.py ada beberapa kode yang eksklusif untuk file b.py dan kami tidak ingin file lain (selain file b.py), yang telah mengimpor file b.py, untuk menjalankannya.
Jadi itulah yang diperiksa oleh baris kode ini. Jika itu adalah file utama (yaitu, b.py) yang menjalankan kode, yang dalam hal ini bukan (a.py adalah file utama yang berjalan), maka hanya kode yang dieksekusi.
sumber
Buat file, a.py :
__name__
selalu sama dengan__main__
setiap kali file itu dijalankan secara langsung menunjukkan bahwa ini adalah file utama.Buat file lain, b.py , di direktori yang sama:
Menjalankannya. Ini akan mencetak sebuah , yaitu, nama file yang diimpor .
Jadi, untuk menunjukkan dua perilaku berbeda dari file yang sama , ini adalah trik yang umum digunakan:
sumber
jika nama == ' utama ':
Kami melihat apakah
__name__ == '__main__':
cukup sering.Ia memeriksa apakah suatu modul sedang diimpor atau tidak.
Dengan kata lain, kode di dalam
if
blok akan dieksekusi hanya ketika kode dijalankan secara langsung. Di sinidirectly
berartinot imported
.Mari kita lihat apa fungsinya menggunakan kode sederhana yang mencetak nama modul:
Jika kami menjalankan kode secara langsung melalui
python test.py
, nama modul adalah__main__
:sumber
Sederhananya, ini adalah titik masuk untuk menjalankan file, seperti
main
fungsi dalam bahasa pemrograman C.sumber
if __name__ == "__main__"
blok. Secara teknis, bagian atas skrip yang dieksekusi adalah titik masuk program.