if __name__ == “__main__” – це конструкція, яка дозволяє додавати до Python модуля код, що буде виконуватись лише тоді, коли модуль запускається як окрема програма, а не імпортується до іншого модуля.
Для прикладу уявімо, що в мене є модуль person.py:
# module person.py
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
def __repr__(self):
return f'Person: {self.first_name} {self.last_name}'
person = Person('Дмитро', 'Коваленко')
print(person)В рядках 13-14 додано код, що перевіряє створення екземпляра класу Person та його відображення. Якщо запустити модуль на виконання, все працює очікувано:
python person.py
# Person: Дмитро КоваленкоТепер додам ще один модуль test.py, котрий імпортує модуль person.py, і також створює екземпляр класу Person та виводить його в консоль:
# module test.py
import person
person = person.Person('Тарас', 'Бугай')
print(person)Якщо запустити модуль test.py на виконання, буде отримано наступний результат:
python test.py
# Person: Дмитро Коваленко
# Person: Тарас БугайРядок – Person: Дмитро Коваленко вказує на те, що під час запуску test.py було виконано код з 13-14 рядка модуля person.py. Це сталося завдяки імпорту модуля person.py до test.py. Інтерпретатор Python виконує весь код, який виявляє у файлах приймаючих участь в запуску програми.
Для запобігання цьому, в Python існує конструкція:
if __name__ == "__main__"Додаю зміни в модуль person.py:
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
def __repr__(self):
return f'Person: {self.first_name} {self.last_name}'
if __name__ == "__main__":
person = Person('Дмитро', 'Коваленко')
print(person)Тепер, якщо виконати модуль person.py, як окрему програму, результат залишається без змін:
python person.py
# Person: Дмитро КоваленкоЯкщо виконати модуль test.py:
python test.py
# Person: Тарас БугайКоли Python запускає модуль в якості основної програми, змінній __name__ з цього модуля автоматично присвоюється значення __main__. Завдяки цьому, конструкція if __name__ == “__main__”, дозволяє керувати виконанням коду, котрий вона обгортає, в залежності від способу використання модуля (окрема програма або імпорт в іншому модулі).