Zrozumienie głównej metody Pythona [duplicate]

To pytanie ma już odpowiedź tutaj:

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()
Author: Kalanka, 2014-03-19

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).

Ja osobiście lubię te semantyki. Zachęca programistów do oddzielania funkcji (definicji) od funkcji (wykonania) i zachęca do ponownego użycia.

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).
 148
Author: Jim Dennis,
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.

 47
Author: Borat Sagdiyev,
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.

 14
Author: Code-Apprentice,
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

 4
Author: Aaron,
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