В этом модуле мы разберем одну из самых важных и часто встречающихся конструкций в Python: __name__ и блок if __name__ == '__main__':. Вы узнаете, как Python определяет, запущен ли скрипт напрямую программистом или импортирован как модуль в другую программу.
Мы пройдем путь от понимания того, что хранится в переменной __name__, до написания профессионального кода, который можно безопасно использовать в больших проектах. Вы научитесь предотвращать нежелательное выполнение кода при импорте, правильно структурировать свои скрипты и создавать модульные тесты внутри файлов.
Впереди вас ждут задания на понимание синтаксиса, логики работы интерпретатора и сборку правильной структуры программы. Эти знания — стандарт индустрии, необходимый каждому Python-разработчику.
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Импорт модулей.
- from ... import.
- if __name__ == '__main__'.
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Значение __name__ при прямом запуске
Мы создали простой скрипт script.py и запустили его напрямую. Какое значение будет выведено на экран?
# Файл: script.py
print(__name__)Значение __name__ при импорте
У нас есть файл utils.py. Мы создаем другой файл main.py и импортируем туда utils. Что выведет функция print, находящаяся внутри utils.py, при запуске main.py? Введите точный текст вывода (без кавычек).
# Файл: utils.py
print(__name__)
# Файл: main.py
import utilsНаписание конструкции if __name__
Заполните пропуски, чтобы создать корректную проверку точки входа. Это стандартный шаблон для защиты кода от выполнения при импорте.
def start_program():
print("Program started")
if input1S == input2S:
start_program()Сопоставьте условия запуска и значение переменной
Соедините сценарий запуска скрипта (слева) с тем, чему будет равна переменная __name__ внутри этого скрипта (справа).
'__main__''имя_файла'Ошибка в проверке условия
В этом коде допущена частая ошибка новичков при сравнении. Найдите её и исправьте строку с условием if.
def main(): print("Running main logic") if __name__ = '__main__': main()Что выполняется при импорте?
Представьте, что у нас есть файл с кодом. Распределите части этого кода по двум категориям: то, что выполнится при любом обращении к файлу (включая импорт), и то, что выполнится только при прямом запуске.
Соберите правильную структуру скрипта
Соберите код так, чтобы функция greeting была определена, но её вызов происходил только если скрипт запущен напрямую. Обратите внимание на отступы.
greeting("Alice")if __name__ == "__main__":def greeting(name): print(f"Hello, {name}")greeting("Bob")Защита кода от выполнения при импорте
Вставьте необходимые элементы из банка, чтобы превратить этот скрипт в безопасный модуль. Функция process_data должна быть доступна для импорта, но тестовый запуск должен срабатывать только при прямом вызове файла.
def process_data(data):
return data * 2
def main():
print(process_data(10))
if input1S == input2S:
input3SПредсказание вывода сложной программы
У нас есть два файла. Мы запускаем файл app.py. Внимательно проследите, что будет напечатано в консоли, учитывая, что один принт находится вне защитного блока.
# Файл: lib.py
print("Lib loaded")
if __name__ == "__main__":
print("Lib main logic")
# Файл: app.py
import lib
print("App finished")