2013-07-12 5 views
3

Я знаю, что это хороший стиль для определения метода main() для скриптовых программ python, так что он может быть дополнительно включен как модуль позже.нет дополнительных отступов с if __name__ == "__main__":

так давайте предположим, этот код (случайный сниппета):

a = 5 
if a > 0: 
    print a 

становится

def main(): 
    a = 5 
    if a > 0: 
     print a 

if __name__ == "__main__": 
    main() 

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

if __name__ != "__main__": 
    return # just leave this file 

a = 5 
if a > 0: 
    print a 

но (конечно), это вызывает:

SyntaxError: 'return' outside function 

что-то подобное возможно? желательно? идиоматическое?

+0

«Я стараюсь избегать ненужных отступов для максимальной ясности» - для максимальной ясности вы могли бы разделить достаточно большой скрипт на функции.Кроме того, вы не используете _need_, чтобы использовать 'if __name__ ==" __main __ "' проверку вообще, если весь ваш файл должен делать, это вести себя как автономный скрипт. Использование его в этих случаях в основном заключается в том, чтобы прояснить поток сценария и предотвратить непреднамеренные побочные эффекты, если он должен быть импортирован где-то. Вы свободны не использовать его, пока знаете, что делаете (например, не импортируете его, не думая о побочных эффектах). – l4mpi

ответ

3

Nope, невозможно, действительно.

Когда __name__ является не'__main__' ваш модуль был импортирован другой кусок кода, как обычный модуль. В таком случае вы не можете выручить раньше.

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

+0

«Что случилось с единовременным дополнительным уровнем отступов?» Он сказал это: речь идет о ясности. сохранить низкий уровень отступа, часто является свойством высококачественного кода – hek2mgl

+1

@ hek2mgl: Я считаю, что функция 'main()' намного яснее в намерениях. –

+3

Функция 'main' (как и все другие функции) должна быть небольшой. Я не вижу причин, по которым уровень отступов для некоторых строк должен уничтожать ясность. Конечно, если вы пишете сотни строк в 'main()', это может стать немного уродливым, но это относится к каждой функции - как уже упоминалось. – tamasgal

3

Вы можете сделать это:

if __name__ != "__main__": 
    throw TypeError("Attempted to import command-line only script") 

# Your code here 

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

+0

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

2

Функция должна сделать одно, и это также относится к main. Он должен сделать (некоторые) main вещи и все остальное должно быть сделано в функциях и классах.

Там нет абсолютно никаких оснований рассматривать это как «ненужный отступа» ...

0

Вы должны были бы побудить импортер себя вести себя по-разному. Возможно, это будет возможно, хотя и сложно, но, конечно, нецелесообразно, поскольку вы будете вводить какое-то очень неожиданное поведение.

Если вы действительно хотите избежать дополнительного отступа, вы можете, я полагаю, реализовать «общедоступный» и «закрытый» модуль, в котором открытый модульный филиал основывается на if __name__ == '__main__' для загрузки другого частного модуля. Но это похоже на много обручей, чтобы проскочить, чтобы избежать нескольких дополнительных углублений. В любом случае, если ваш main() достаточно длинный, чтобы отступы вас подслушивали, вам, вероятно, следует подумать о том, чтобы больше разбить его на функции в первую очередь.