Понимание основного метода python

Я новичок в Python, но у меня есть опыт работы на других языках ООП. Мой курс не объясняет основной метод в 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()

Ответ 1

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

Семантика немного тонкая. Идентификатор __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__)

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

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

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

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

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

Сводка: if __name__ == '__main__': имеет два основных варианта использования:

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

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

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

Ответ 2

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

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

def meth1():
    print("meth1")

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

Выход -

meth1
main code

Подробнее о главном() - http://ibiblio.org/g2swap/byteofpython/read/module-name.html

Модуль __name__

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

Использование модуля __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__, это означает, что модуль запускается автономно пользователем, и мы можем делать соответствующие соответствующие действия.

Ответ 3

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

Чтобы быть ясным, это означает, что интерпретатор Python запускается в первой строке файла и выполняет его. Выполнение таких строк, как class Foobar: и def foobar() создает либо класс, либо функцию и сохраняет их в памяти для последующего использования.

Ответ 4

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

if __name__ == '__main__':
    ...

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

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

Это более подробно описано в python.berkely.edu