Понимание основного метода python [дубликат]


этот вопрос уже есть ответ здесь:

Я новичок в Python, но у меня есть опыт работы на других языках OOPS. Мой курс не объясняет основной метод в Python.

пожалуйста, скажите мне, как основной метод работает в python ? Я в замешательстве потому что я пытаюсь сравнить его с Java.

def main():
# display some lines

if __name__ == "__main__": main()

как выполняется main и зачем мне это странно if для выполнения main. Мой код завершается без вывода, когда я удалить if.

минимальный код -

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 109

4 ответа:

подход Python к" main " почти уникален для языка(*).

семантика немного тонкая. Элемент __name__ идентификатор привязывается к имени любого модуля при его импорте. Однако, когда файл выполняется, то __name__ установлено значение "__main__" (строковое значение: __main__).

это почти всегда используется для разделения части кода, который должен быть выполнен из частей кода, которые определяют функциональность. Так что код Python часто содержит строку типа:

#!/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__)

С помощью этого соглашения можно иметь файл, определяющий классы и функции для использования в других программах, а также включать код для оценки только тогда, когда файл вызывается как автономный скрипт.

важно понимать, что весь код выше if __name__ строка выполняется, оценивается, в обоих случаях. Он вычисляется интерпретатором при импорте файла или при его выполнении. Если вы ставите print заявление элемент if __name__ строка, то он будет печатать вывод каждый раз, когда любой другой код пытается импортировать, что в качестве модуля. (Конечно, это было бы анти-социальные. Не делай этого).

мне лично нравится эта семантика. Это побуждает программистов отделять функциональность (определения) от функции (выполнения) и поощряет повторное использование.

в идеале почти каждый модуль Python может сделать что-то полезное при вызове из командной строки. Во многих случаях это используется для управление модульными тестами. Если конкретный файл определяет функциональность, которая полезна только в контексте других компонентов системы, то можно использовать __name__ == "__main__" выделить блок кода, который вызывает набор модульных тестов, которые применяются к данному модулю.

(если у вас не будет такой функциональности или модульных тестов, то лучше всего убедиться, что режим файла не является исполняемым).

резюме: if __name__ == '__main__': имеет два основных применения случаи:

  • разрешить модулю предоставлять функциональность для импорта в другой код, а также предоставлять полезную семантику в качестве автономного скрипта (оболочка командной строки вокруг функциональности)
  • разрешить модулю определять набор модульных тестов, которые хранятся в том же файле, что и тестируемый код, и которые могут выполняться независимо от остальной кодовой базы.

это довольно распространенное к def main(*args) и if __name__ == '__main__': просто звоните main(*sys.argv[1:]) если вы хотите определить main таким образом, который похож на некоторые другие языки программирования. Если ваш файл .py в первую очередь предназначен для использования в качестве модуля в другом коде, то вы можете def test_module(), а вызов test_module() в своем if __name__ == '__main__:' люкс.

  • (Ruby также реализует аналогичную функцию if __file__ == ).

в Python выполнение не должно начинаться с main. Первая строка " исполняемый код" выполняется первым.

def main():
    print("main code")

def meth1():
    print("meth1")

meth1()
if __name__ == "__main__":main() ## with if

выход -

meth1
main code

подробнее на main () -http://ibiblio.org/g2swap/byteofpython/read/module-name.html

модуль __name__

каждый модуль имеет имя и отчетности в модуле могут узнать имя своего модуля. Это особенно удобно в одном особая ситуация - как упоминалось ранее, когда модуль импортируется в первый раз, запускается основной блок в этом модуле. Что делать, если мы хотим запустить блок только в том случае, если программа использовалась сама по себе, а не когда она была импортирована из другого модуля? Это может быть достигнуто с помощью имя атрибут модуля.

используя имя модуля___

#!/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'

выход -

$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>

Как Это Работает -

каждый модуль Python имеет __name__ определено и если это __main__, это означает, что модуль запускается автономно пользователем, и мы можем выполнять соответствующие соответствующие действия.

Python не имеет определенной точки входа, такой как Java, C, C++ и т. д. Скорее он просто выполняет исходный файл построчно. Элемент if оператор позволяет создать main функция, которая будет выполнена, если ваш файл загружен как "основной" модуль, а не как библиотека в другом модуле.

Если вы импортируете файл модуля (. py), который вы создаете сейчас из другого скрипта python, он будет не выполнить код внутри

if __name__ == '__main__':
    ...

при запуске скрипта из консоли, он будет выполнен.

Python не использует и не требует функции main (). Любой код, который не защищен этой защитой, будет выполнен после выполнения или импорт модуля.

это расширено на немного больше в python.berkely.edu