Vairāk
Ko dara if __name__ == "__main__":?
Ko dara 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))
5496
3
Ikreiz, kad Python tulks nolasa avota failu, tas veic divas darbības:
__vārds__
, un pēc tamAplūkosim, kā tas darbojas un kā tas ir saistīts ar jūsu jautājumu par
__name__
pārbaudēm, ko mēs vienmēr redzam Python skriptos. Koda paraugsLai izpētītu, kā darbojas imports un skripti, izmantosim nedaudz atšķirīgu koda paraugu. Pieņemsim, ka failā ar nosaukumu
foo.py
ir šāds ieraksts.Īpašie mainīgie
Kad Python interpeter nolasa avota failu, tas vispirms definē dažus īpašus mainīgos. Šajā gadījumā mums ir svarīgs mainīgais
__name__
. Kad jūsu modulis ir galvenā programma Ja jūsu modulis (avota fails) tiek palaists kā galvenā programma, piem.tulkojums piešķirs mainīgajam
__vārds__
"__main__"`` kodēto virkni, t.i.,
name``.Kad jūsu moduli importē cits modulis No otras puses, pieņemsim, ka kāds cits modulis ir galvenā programma un tas importē jūsu moduli. Tas nozīmē, ka galvenajā programmā vai kādā citā modulī, ko importē galvenā programma, ir šāds paziņojums:
Šādā gadījumā tulks apskatīs jūsu moduļa
foo.py
faila nosaukumu, atdalīs.py
un šo virkni piešķirs jūsu moduļa mainīgajam__name__
, t.i.Moduļa's koda izpilde
Pēc speciālo mainīgo iestatīšanas tulks izpilda visu moduļa kodu pa vienam izteikumam. Lai varētu sekot līdzi šim skaidrojumam, iespējams, vēlēsieties atvērt vēl vienu logu sānos ar koda paraugu. Vienmēr
"pirms importēšanas"
(bez pēdiņām).math
moduli un piešķir to mainīgajam ar nosaukumumath
. Tas ir līdzvērtīgiimport math
aizstāšanai ar šādu (ņemiet vērā, ka `import`` ir zema līmeņa Python funkcija, kas pieņem virkni un izraisa faktisko importēšanu):"pirms funkcijasA"
.def
bloku, izveidojot funkcijas objektu, un pēc tam piešķir šo funkcijas objektu mainīgajam ar nosaukumufunkcijaA
."pirms funkcijasB"
.def
bloks, izveidojot vēl vienu funkcijas objektu, pēc tam piešķirot to mainīgajam ar nosaukumufunkcijaB
."pirms __name__ guard"
. Tikai tad, ja jūsu modulis ir galvenā programma__name__
patiešām ir iestatīts uz"__main__"
, un tā izsauks abas funkcijas, izdrukājot virknes"Funkcija A"
un"Funkcija B 10.0"
. Tikai tad, ja jūsu moduli importē cits modulis__name__
būs"foo"
, nevis"__main__"
, un tiks izlaistaif
paziņojuma būtība. Vismēr"pēc __name__ aizsargs"
. Kopsavilkums Apkopojot, šeit ir aprakstīts, kas tiks izdrukāts abos gadījumos:Kāpēc tas tā darbojas?
Jums, protams, varētu rasties jautājums, kāpēc kāds to vēlētos. Dažreiz jūs vēlaties uzrakstīt
.py
failu, ko var izmantot citas programmas un/vai moduļi kā moduli, un ko var palaist arī kā galveno programmu. Piemēri:Jūsu modulis ir bibliotēka, bet jūs vēlaties, lai tas darbotos skripta režīmā, kurā tiek palaisti daži vienības testi vai demo.
Jūsu modulis tiek izmantots tikai kā galvenā programma, bet tajā ir daži vienību testi, un testēšanas ietvars darbojas, importējot
.py
failus, piemēram, jūsu skriptu, un palaižot īpašas testu funkcijas. Jūs nevēlaties, lai tas mēģinātu palaist skriptu tikai tāpēc, ka tas importē moduli.Jūsu modulis lielākoties tiek izmantots kā galvenā programma, taču tas nodrošina arī programmētājam draudzīgu API pieredzējušiem lietotājiem. Papildus šiem piemēriem, tas ir elegants, ka skripta palaišana Python ir tikai dažu maģisko mainīgo iestatīšana un skripta importēšana. "Skripta palaišana" ir skripta moduļa importēšanas blakus efekts. Pārdomu viela
Jautājums: Vai man var būt vairāki
__name__
pārbaudes bloki? Atbilde: Tas'ir dīvaini, bet valoda jūs neapturēs.Pieņemsim, ka
foo2.py
ir šāds bloks. Kas notiks, ja komandrindā pateiksietpython foo2.py
? Kāpēc?__name__
pārbaudifoo3.py
:Kad skripts tiek palaists, nododot to kā komandu Python interpretatoram,
tiek izpildīts viss kods, kas ir 0 ievilkuma līmenī. Definētās funkcijas un klases ir definētas, kā arī ir definētas, bet neviens no to kodiem netiek izpildīts. Atšķirībā no citām valodām šeit nav
main()
funkcijas, kas tiek automātiski izpildīta -main()
funkcija ir viss augšējā līmeņa kods.Šajā gadījumā augstākā līmeņa kods ir
if
bloks.__name__
ir iebūvēts mainīgais, kura vērtība ir pašreizējā moduļa nosaukums. Tomēr, ja modulis tiek palaists tieši (kāmyscript.py
iepriekš), tad__name__
tiek iestatīts uz virkni"__main__"
. Tādējādi jūs varat pārbaudīt, vai jūsu skripts tiek palaists tieši vai importēts ar kaut ko citu, testējotJa jūsu skripts tiek importēts citā modulī, tā dažādās funkciju un klašu definīcijas tiks importētas un tā augstākā līmeņa kods tiks izpildīts, bet kods, kas ir iepriekš minētā
if
klauzulas "then" ķermenī, netiks izpildīts, jo nosacījums nav izpildīts. Kā pamata piemēru aplūkojiet šādus divus skriptus:Tagad, ja jūs izsaucat tulku kā
Izvades rezultāts būs šāds
Ja tā vietā palaidīsiet
two.py
:Jūs saņemat
Tādējādi, ielādējot moduli
one
, tā__name__
ir"one"
, nevis"__main__"
.if __name__ == "__main__"
ir daļa, kas tiek palaista, kad skripts tiek palaists no (teiksim) komandrindas, izmantojot komandu, piemēram,python myscript.py
.