Данный материал будет интересен в первую очередь тем тестировщикам, которые желают понять, как же правильно оперировать популярной функцией «main» в Python.
Как мы знаем, язык программирования Python очень сильно похож на стандартный скриптовый язык: например, все строчки внутри файла (file.py) будут выполняться всегда, когда данный файлик запускается пользователем.
Модулям не требуется функция main.
Например, мы имеем в своем распоряжении модуль под названием bugs.py с таким программным кодом:
После ее корректного старта, мы получим вот такой результат:
Параметр print_bugs был активирован как простая строка программного кода, а не в виде функции.
Когда модуль стал активным, соответствующая строчка была исполнена в должной мере.
Но это может вызвать проблему, если bugs будет импортироваться иным модулем.
Например, мы располагаем вторым модулем под названием more_bugs.py:
На первый взгляд, пользователь может ожидать вывода сразу двух строк кода.
Но, старт файла more_bugs.py, на самом деле, отобразит минимум три строчки:
Можно задаться вопросом, а почему строчка «bugs happened» отображается в дубликате? Все просто: при вызове параметра «import bugs» модуль bugs уже был загружен, а значит, когда модуль загружен, содержащийся в нем программный код автоматически выполнится.
Параметр print_bugs был вызван в четвертой строке модуля bugs. Потом он будет вызван вновь уже в третьей строке модуля more_bugs.
Как избежать подобного бага? Очень просто: пользователю достаточно протестировать переменную _name _ модуля.
Данная переменная будет динамически установлена в качестве наименования модуля.
Если модуль — базовая точка входа, то _name _ будет задан в виде «_ main _».
В иных случаях, если модуль, банально, импортируется, он будет задаваться как наименование файла модуля без приставки расширения py.
Теперь, для лучшего понимания всего вышеописанного на практике, можно переписать все тестируемые модули.
Например, bugs:
А теперь more_bugs:
Если теперь запустить файлик more_bugs, то строка «bugs happened!» будет выведена только единоразово:
Хорошая практика процесса программирования модулей в Python: они, банально, не должны содержать связь между напрямую вызываемых строк.
В них должны быть только функции, классы и инициализация переменных.Все выполняемое как содержимое «main» должно реализовываться только после проверки на условие «if _ name _ == _ main _».
В данном случае, при импортировании модуля другим модулем чужих вызовов не случится.
Переменная на _ name _ дополнительно делает тело «main» доступнее для понимания в контексте новичка, изучающего язык программирования Python.
Оставить комментарий