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__”, дозволяє керувати виконанням коду, котрий вона обгортає, в залежності від способу використання модуля (окрема програма або імпорт в іншому модулі).


Мітки: