никаких дополнительных отступов с if name = = " main ":
Я знаю, что это хороший стиль для определения метода main() для" скриптовых " программ python, поэтому он может быть дополнительно включен в качестве модуля позже.
Итак, предположим, что этот код (случайный фрагмент):
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
Возможно ли нечто подобное? желательно? идиоматика?
4 ответа:
Нет, на самом деле это невозможно.
Когда
__name__
не является'__main__'
ваш модуль был импортирован другим фрагментом кода, как обычный модуль. В этом случае вы не можете выйти из игры раньше времени.И что не так с один раз дополнительный уровень отступа? Просто нажмите tab в редакторе и покончите с этим? Лично я считаю, что использование функции
main()
документирует намерение гораздо лучше, чем оставлять код без привязки.
Вы Можете сделать это:
if __name__ != "__main__": throw TypeError("Attempted to import command-line only script") # Your code here
Однако я бы не советовал использовать этот шаблон - в большинстве случаев должно быть довольно очевидно, что скрипт является только командной строкой. И если у кого-то есть вариант использования для чего-то, что вы определили в скрипте, они не должны редактировать его, чтобы иметь возможность импортировать одну функцию.
Функция должна делать одну вещь, и это также относится к
main
. Он должен делать (некоторые)main
вещи, а все остальное должно быть сделано в функциях и классах.Нет абсолютно никаких оснований рассматривать это как "ненужное отступление" ...
Вам придется заставить самого импортера вести себя по-другому. Это может быть возможно, хотя и трудно, но, конечно, не рекомендуется, так как вы будете вводить какое-то очень неожиданное поведение.
Если вы действительно хотите избежать дополнительного отступа, вы могли бы, я полагаю, реализовать "публичный" и "частный" модуль, где публичный модуль ветвится на основе
if __name__ == '__main__'
для загрузки другого частного модуля. Но это похоже на множество обручей, чтобы перепрыгнуть через них, чтобы избежать нескольких дополнительных углублений. В в любом случае, если вашmain()
достаточно длинный, чтобы отступ не давал вам покоя, вам, вероятно, следует подумать о том, чтобы разбить его на функции в первую очередь.