Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 29, 2016 21:49:59

ilnaz
Зарегистрирован: 2016-10-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__":

Прочитал много постов, комментариев под ними, но так и не понял для чего нужна конструкция:if __name__ == “__main__”:. Может кто нибудь да объяснит? Буду благодарен.

Офлайн

#2 Окт. 29, 2016 22:06:53

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

if __name__ == "__main__":

Ну значит не тех постов читал… То что в “ифе” будет исполнено толко когда “нейм” = “майн”. А “нейм” = “майн” бывает только когда ты этот именно файлик запускаешь.

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

Офлайн

#3 Окт. 29, 2016 22:56:58

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

if __name__ == "__main__":

Iskatel
когда файл есть модуль, и под такими конструкциями пишут тесты этого модуля
По сути Iskatel правильно написал, но я бы не советовал на это забивать. Это одна из основных конструкций, которая позволяет использовать файл и как исполняемую утилиту и как модуль содержащий полезные функции. Например вы написали утилиту ls которая формирует разные варианты списка файлов в данной директории. Вы можете ядро функционала вынести в функцию
 def my_ls(root,opt):
   ....
if __name__  ==  __main__:
    argv_parsing
    ....
    my_ls(argv[0],...)

А потом у вас будет еще 10 утилит например ls_email,ls_docx
в которых вы будете использовать эту функцию

 from ls import my_ls
def ls_emil(root,opt):
   mail_list = my_ls("*.eml",...)
   ....
if __name__  ==  __main__:
    argv_parsing
    ....
    my_email(argv[0],...)

А для тестирования используют unit_test, doctest, nose и т.п. конструкция if __name__ == __main__: к тестированию имеет мало отношения.



Отредактировано doza_and (Окт. 29, 2016 22:58:55)

Офлайн

#4 Окт. 30, 2016 03:39:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

if __name__ == "__main__":

ilnaz
но так и не понял для чего нужна конструкция
Любой файл .py может быть импортирован в другом коде. При импортировании файл весь выполняется. Импортируют файлы для того, чтобы получить классы и функции, которые в них определены. И вот эта часть if __name__ … даёт возможность не выполнять часть кода при импортировании. Всё, что в таком if'е, будет выполняться только тогда, когда файл запускается непосредственно.

Вот пример файла
  
def f(a, b):
    return 2 * a + b
 
if __name__ == '__main__':
    print(f(2, 3))

Если ты запустишь этот файл, на экран выведется 5. Но если тебе нужна функция f() где-нибудь в другом коде, то тебе надо просто импортировать файл, а потом взять из него функцию f() и подать в неё свои какие-то числа. При этом тебе не надо на экран выводить 5. При импортировании __name__ не будет равно строке ‘__main__’, поэтому этот участок с выводом 5 не выполнится.



Отредактировано py.user.next (Окт. 30, 2016 03:47:10)

Офлайн

#5 Окт. 30, 2016 12:27:13

ilnaz
Зарегистрирован: 2016-10-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__":

Ну теперь вроде понял. А вот где и как это можно применить? Можете привести пример.

Офлайн

#6 Окт. 30, 2016 13:40:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

if __name__ == "__main__":

ilnaz
А вот где и как это можно применить?
Модуль обычно отвечает за что-то. Например, модуль math отвечает за математические операции типа sin(), cos(), sqrt(). Не везде эти операции нужны, поэтому все они собраны в отдельном модуле, который их объединяет по их назначению и держит отдельно. В тех программах, где они нужны, модуль math просто импортируется, и таким образом функции из него становятся доступны в программе. А в тех программах, где они не нужны, ничего не импортируется и для программы эти операции как бы не существуют. Но модуль math нельзя запустить сам по себе, его можно только импортировать. Но есть модули, которые можно как импортировать, так и запустить сами по себе - например, модуль timeit или unittest. Если ты их импортируешь, то тебе становятся доступны классы из них - например, timeit.Timer() или unittest.TestCase(). Но если ты их запустишь напрямую, то timeit позволяет замерять время выполнения кода, а unittest может обнаруживать файлы с тестами в текущем каталоге и выполнять их. Когда же ты пишешь свой модуль, он точно так же должен соответствовать правилам формирования модуля - нести какую-то одну функцию (предназначение) и объединять внутренние структуры чем-то. При этом сам по себе он может выполнять конкретные действия, а при импортировании его содержимое можно использовать для многих других программ, которые к его конкретным действиям не имеют отношения.



Отредактировано py.user.next (Окт. 30, 2016 13:45:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version