2017-01-27 9 views
0

Мне интересно, есть ли какая-то разница между этими двумя реализациями:Использование функции main()?

def main(): 
    somecode() 

if __name__ == '__main__': 
    main() 

и альтернативный вариант:

if __name__ == '__main__': 
    somecode() 

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

+1

'main' нет ничего особенного, просто функция, которая улучшает понимание ... означает, что это «основная» часть программы, где все происходит. Объединение других функций в одну функцию делает ее более чистой ИМО. Это также место, где можно включить логику аргументов и другие вещи. – Li357

+1

Вы делаете разработчиков C/C++ более счастливыми с прежними :) – miradulo

ответ

2

Единственное практическое Разница, о которой я могу думать, - это то, что применяется к ответу, который я дал сегодня сегодня here.

Определение основной логики в своей собственной функции main(), а не непосредственно в пределах if __name__ == '__main__' блока облегчает обрабатывать случаи, когда программа должна прерваться преждевременно:

def main(): 
    ... 
    if not continue_program: 
     return 

    ... 
    if not continue_program: 
     return 

    ... 

if __name__ == '__main__': 
    main() 

, получил такое же поведение, непосредственно из if блок, мне нужно было вложить несколько условных тел (или использовать что-то некрасивое, как sys.exit()).

+0

Почему бы не поместить эти операторы if после 'if __name __ ==' __main__ '': – freude

+0

@freude Если бы я сделал это, основной текст моего кода не был бы выполнялся внутри функции, то есть я не смог бы использовать 'return' и, следовательно, потребовал бы, чтобы я использовал уродливые вложенные условные блоки, как я сказал в ответе. – Tagc

+1

@freude Кроме того, код, выполняющийся в функции, более эффективен, чем код, запущенный в глобальном контексте, потому что поиск локального имени быстрее, чем поиск по глобальному имени. –

2

Если у вас есть код в точности так, как данные, то прямой вызов somecode() выглядит чище меня:

if __name__ == '__main__': 
    somecode() 

Это происходит потому, что в Python, main это просто еще одна функция, а не специальная функция, как и в C/Java ,

Однако, если ваша главная функция вызывает несколько функций, то

def main(): 
    somecode1() 
    somecode2()  
    somecode3() 

if __name__ == '__main__': 
    main() 

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

if __name__ == '__main__': 
    somecode1() 
    somecode2()  
    somecode3() 

Обратите внимание, что,

def main(): 
    somecode1() 
    somecode2()  
    somecode3() 

if __name__ == '__main__': 
    main() 

эквивалентно, а главное снова просто другое название для функции здесь

def somecode(): 
    somecode1() 
    somecode2()  
    somecode3() 

if __name__ == '__main__': 
    somecode()