Форум сайта python.su
0
Прочитал много постов, комментариев под ними, но так и не понял для чего нужна конструкция:if __name__ == “__main__”:. Может кто нибудь да объяснит? Буду благодарен.
Офлайн
3
Ну значит не тех постов читал… То что в “ифе” будет исполнено толко когда “нейм” = “майн”. А “нейм” = “майн” бывает только когда ты этот именно файлик запускаешь.
Вобщем на эту ерунду можно пока забить, используется когда файл есть модуль, и под такими конструкциями пишут тесты этого модуля. Они исполняются только когда модуль сам по себе запустишь, не включая никуда.
Офлайн
253
IskatelПо сути Iskatel правильно написал, но я бы не советовал на это забивать. Это одна из основных конструкций, которая позволяет использовать файл и как исполняемую утилиту и как модуль содержащий полезные функции. Например вы написали утилиту ls которая формирует разные варианты списка файлов в данной директории. Вы можете ядро функционала вынести в функцию
когда файл есть модуль, и под такими конструкциями пишут тесты этого модуля
def my_ls(root,opt): .... if __name__ == __main__: argv_parsing .... my_ls(argv[0],...)
from ls import my_ls def ls_emil(root,opt): mail_list = my_ls("*.eml",...) .... if __name__ == __main__: argv_parsing .... my_email(argv[0],...)
Отредактировано doza_and (Окт. 29, 2016 22:58:55)
Офлайн
857
ilnazЛюбой файл .py может быть импортирован в другом коде. При импортировании файл весь выполняется. Импортируют файлы для того, чтобы получить классы и функции, которые в них определены. И вот эта часть if __name__ … даёт возможность не выполнять часть кода при импортировании. Всё, что в таком if'е, будет выполняться только тогда, когда файл запускается непосредственно.
но так и не понял для чего нужна конструкция
def f(a, b): return 2 * a + b if __name__ == '__main__': print(f(2, 3))
Отредактировано py.user.next (Окт. 30, 2016 03:47:10)
Офлайн
0
Ну теперь вроде понял. А вот где и как это можно применить? Можете привести пример.
Офлайн
857
ilnazМодуль обычно отвечает за что-то. Например, модуль math отвечает за математические операции типа sin(), cos(), sqrt(). Не везде эти операции нужны, поэтому все они собраны в отдельном модуле, который их объединяет по их назначению и держит отдельно. В тех программах, где они нужны, модуль math просто импортируется, и таким образом функции из него становятся доступны в программе. А в тех программах, где они не нужны, ничего не импортируется и для программы эти операции как бы не существуют. Но модуль math нельзя запустить сам по себе, его можно только импортировать. Но есть модули, которые можно как импортировать, так и запустить сами по себе - например, модуль timeit или unittest. Если ты их импортируешь, то тебе становятся доступны классы из них - например, timeit.Timer() или unittest.TestCase(). Но если ты их запустишь напрямую, то timeit позволяет замерять время выполнения кода, а unittest может обнаруживать файлы с тестами в текущем каталоге и выполнять их. Когда же ты пишешь свой модуль, он точно так же должен соответствовать правилам формирования модуля - нести какую-то одну функцию (предназначение) и объединять внутренние структуры чем-то. При этом сам по себе он может выполнять конкретные действия, а при импортировании его содержимое можно использовать для многих других программ, которые к его конкретным действиям не имеют отношения.
А вот где и как это можно применить?
Отредактировано py.user.next (Окт. 30, 2016 13:45:19)
Офлайн