никаких дополнительных отступов с 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 3

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() достаточно длинный, чтобы отступ не давал вам покоя, вам, вероятно, следует подумать о том, чтобы разбить его на функции в первую очередь.