Ответ 1
#!/usr/bin/env python
import sys
def main(args):
print args
if __name__ == '__main__':
main(sys.argv)
edit: эмулировать возврат void
.
Что такое эквивалент Python "public static void main (String [] args) {...}"? Я помню, что использовал его в прошлом, а потом забыл.
То, что я в основном пытаюсь запомнить, - это функция, которая, я думаю, включает некоторые подчеркивания (__)...
ТНХ
#!/usr/bin/env python
import sys
def main(args):
print args
if __name__ == '__main__':
main(sys.argv)
edit: эмулировать возврат void
.
if __name__ == "__main__":
....do your thing
Это обычно используемая идиома, но она НЕ эквивалентна Java public static void main(String args[])
. Все модули Python выполняют сверху вниз все заявления в области модуля. Для большинства импортированных модулей эти операторы обычно ограничиваются определениями классов и методов, которые устанавливают значения в пространстве имен модулей, но фактически не выполняют код функций. Но если вы поместите оператор в область модуля, например SPECIAL_CONSTANT = 42
, то это будет выполняться немедленно, когда модуль будет импортирован или запущен автономно - нет необходимости в main()
или __main__
или что-то еще. Попробуйте поставить оператор print
в верхней части простого модуля. Если вы импортируете этот модуль или запускаете его самостоятельно из командной строки, оператор print
всегда будет выполняться.
Что нравится в этой идиоме, так это то, что она позволяет встроить некоторые простые тесты или демонстрационный код прямо в библиотеку, которая обычно импортируется некоторым модулем, написанным вашим клиентом. Может быть, что-то вроде этого:
# special_super_duper_module.py
# this next statements will run, even though not in main() or set off
# with "__name__ ==" tests or any such thing
print "You are using special_super_duper_module.py, written by Felix the Cat"
SPECIAL_CONSTANT = 42
def super_duper_function1():
pass
def super_duper_function2():
pass
if __name__ == "__main__":
print "You are running special_super_duper_module.py interactively"
assert super_duper_function1() == None, "expected None, got non-None result"
assert super_duper_function2() == None, "expected None, got non-None result"
# doctests or unittests could also go here, or just a simple demo
Когда модуль импортируется с помощью некоторого кода, который хочет использовать функции супер-пупера, тогда маленький баннер в верхней части будет печатать, но код, который обусловлен if __name__ etc....
, не будет запущен. Но если ваш пользователь запускает модуль напрямую с помощью команды python, тогда запускается встроенный тестовый или демонстрационный код.
Напротив, public static void main(String args[])
- это специальная сигнатура метода, которая сообщает Java VM, какой метод для чего начать. Python только начинается в верхней части именованного модуля и начинает работать оттуда. Вот почему вам нужно только написать:
print "Hello, World!"
в модуле само по себе написать свою первую программу Python.
Классические версии выше чаще всего используются, но для чего-то более полного, посмотрите сообщение в блоге Guido van Rossum:
Все вещи Pythonic: функции Python main() (также просмотр комментарии для более)
О!
if __name__ == '__main__':