Понимание основного метода 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 ответа:
подход 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__
строка выполняется, оценивается, в обоих случаях. Он вычисляется интерпретатором при импорте файла или при его выполнении. Если вы ставите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