Zrozumienie głównej metody Pythona [duplicate]
To pytanie ma już odpowiedź tutaj:
- What does if _ _ name _ _ = = "__ main__": do? 27 odpowiedzi
Jestem nowy w Pythonie, ale mam doświadczenie w innych językach OOPS. Mój kurs nie wyjaśnia głównej metody w Pythonie.
Proszę mi powiedzieć, jak działa główna metoda w Pythonie ? Jestem zdezorientowany, ponieważ próbuję porównać go do Javy.
def main():
# display some lines
if __name__ == "__main__": main()
Jak jest wykonywany main i dlaczego potrzebuję tego dziwnego {[2] } do wykonania main
. Mój kod jest zakończony bez wyjścia po usunięciu if
.
The minimal code-
class AnimalActions:
def quack(self): return self.strings['quack']
def bark(self): return self.strings['bark']
class Duck(AnimalActions):
strings = dict(
quack = "Quaaaaak!",
bark = "The duck cannot bark.",
)
class Dog(AnimalActions):
strings = dict(
quack = "The dog cannot quack.",
bark = "Arf!",
)
def in_the_doghouse(dog):
print(dog.bark())
def in_the_forest(duck):
print(duck.quack())
def main():
donald = Duck()
fido = Dog()
print("- In the forest:")
for o in ( donald, fido ):
in_the_forest(o)
print("- In the doghouse:")
for o in ( donald, fido ):
in_the_doghouse(o)
if __name__ == "__main__": main()
4 answers
Podejście Pythona do "main" jest prawie unikalne dla języka(*).
Semantyka jest nieco subtelna. Identyfikator __name__
jest powiązany z nazwą dowolnego modułu podczas importowania. Jednakże, gdy plik jest wykonywany, to __name__
jest ustawione na "__main__"
(literalny ciąg znaków: __main__
).
Jest to prawie zawsze używane do oddzielenia części kodu, który powinien być wykonywany, od części kodu, które definiują funkcjonalność. Więc kod Pythona często zawiera linię like:
#!/usr/bin/env python
from __future__ import print_function
import this, that, other, stuff
class SomeObject(object):
pass
def some_function(*args,**kwargs):
pass
if __name__ == '__main__':
print("This only executes when %s is executed rather than imported" % __file__)
Używając tej konwencji można mieć plik definiujący klasy i funkcje do użycia w innych programach, a także zawierać kod do oceny tylko wtedy, gdy plik jest wywoływany jako samodzielny skrypt.
Ważne jest, aby zrozumieć, że cały kod powyżej linii if __name__
jest wykonywany, oceniany, w obu przypadkach. Interpreter jest oceniany podczas importowania lub wykonywania pliku. Jeśli umieścisz instrukcję print
przed linią if __name__
, zostanie ona wydrukowana wyjście za każdym razem, gdy jakikolwiek inny kod próbuje zaimportować go jako moduł. (Oczywiście, byłoby to antyspołeczne. Nie rób tego).
Idealnie, prawie każdy moduł Pythona może zrobić coś użytecznego, jeśli zostanie wywołany z linii poleceń. W wielu przypadkach jest to wykorzystywane do zarządzania testami jednostkowymi. Jeśli dany plik definiuje funkcjonalność, która jest użyteczna tylko w kontekście innych komponentów systemu, wtedy nadal można użyć __name__ == "__main__"
, aby wyizolować blok kodu, który wywołuje zestaw testów jednostkowych, które mają zastosowanie do tego modułu.
(jeśli nie chcesz mieć takiej funkcjonalności ani testów jednostkowych, najlepiej upewnić się, że tryb plików nie jest wykonywalny).
Podsumowanie: if __name__ == '__main__':
ma dwa podstawowe przypadki użycia:
- pozwalają modułowi zapewnić funkcjonalność importu do innego kodu, a także w przeciwieństwie do innych systemów, w których funkcjonalność nie jest dostępna, nie można jej używać.]}
- umożliwia modułowi zdefiniowanie zestawu testów jednostkowych, które są przechowywane (w tym samym pliku Co) kod do przetestowania i które mogą być wykonywane niezależnie od reszty kodu.
Jest dość powszechne def main(*args)
i mieć if __name__ == '__main__':
po prostu wywołaj main(*sys.argv[1:])
, jeśli chcesz zdefiniować main w sposób podobny do innych języków programowania. Jeśli Twój plik. py jest przede wszystkim przeznaczony do użycia jako moduł w innym kodzie, wtedy możesz def test_module()
i wywołać test_module()
w swoim if __name__ == '__main__:'
pakiecie.
- (Ruby implementuje również podobną funkcję
if __file__ == $0
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 10:41:26
W Pythonie wykonanie nie musi zaczynać się od main. Pierwsza linijka " kodu wykonywalnego" jest wykonywany jako pierwszy.
def main():
print("main code")
def meth1():
print("meth1")
meth1()
if __name__ == "__main__":main() ## with if
Wyjście -
meth1
main code
Więcej na stronie głównej() - http://ibiblio.org/g2swap/byteofpython/read/module-name.html
A module ' s __name__
Każdy moduł ma nazwę, A instrukcje w module mogą znaleźć nazwę jego modułu. Jest to szczególnie przydatne w jednej konkretnej sytuacji - jak wspomniano wcześniej, gdy moduł jest zaimportowany po raz pierwszy, główny blok w tym module jest uruchamiany. Co jeśli chcemy uruchomić blok tylko wtedy, gdy program był używany sam, a nie wtedy, gdy został zaimportowany z innego modułu? Można to osiągnąć za pomocą atrybutu name modułu.
Używanie nazwy modułu ____
#!/usr/bin/python
# Filename: using_name.py
if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
Wyjście -
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
Jak To Działa -
Każdy moduł Pythona ma zdefiniowaną wartość __name__
i jeśli jest to __main__
, oznacza to, że moduł jest uruchamiany samodzielnie przez użytkownika i możemy wykonać odpowiednie działania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-02 05:40:58
Python nie ma zdefiniowanego punktu wejścia, takiego jak Java, C, C++ itp. Raczej po prostu wykonuje plik źródłowy linia po linii. Instrukcja if
pozwala na utworzenie main
funkcji, która zostanie wykonana, jeśli plik zostanie załadowany jako "główny" moduł, a nie jako Biblioteka w innym module.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-18 22:17:17
Jeśli zaimportujesz plik modułu (. py), który teraz tworzysz z innego skryptu Pythona, to nie wykona kod w
if __name__ == '__main__':
...
Jeśli uruchomisz skrypt bezpośrednio z konsoli, zostanie on wykonany.
Python nie używa ani nie wymaga funkcji main (). Każdy kod, który nie jest chroniony przez ten strażnik, zostanie wykonany po zaimportowaniu lub modułu.
To jest rozszerzone na trochę więcej w python.berkely.edu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-22 03:23:13