Задать вопрос
@Noivi
Noob

Лаконичный код, для нуба на Python =/ _main_, _name_?

У меня, как у абсолютно начинающего "программиста" Python, имеется проблема с разбором на обычном языке, как прикрутить несколько файлов (скриптов) для работы в одном проекте.
Ну например:
Я пишу программу и использую для этого текстовый файл main.py в котором у меня например прописано основное окно программы, его менюшки и т.д., но при переключении меню, должны открываться новые окна, но проблема не в этом, а в том, что например я прописал код для контекстного меню (ну там копировать, вырезать, вставить и тд) и хочу применять его во всех окнах, как это сделать, не копируя код повсюду?
Я читаю про __main__, __name__ и т.д., но прям никак не могу понять, как это работает. Объясните дураку, обычным языком?
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Простой 10 комментариев
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Это несложно, на самом деле.
Когда ты делаешь import module_name, Питон ищет либо файл module_name.py, либо пакет module_name. Про пакеты пока говорить не будем. Если такой файл нашелся, и он ещё не был импортирован, то он выполняется в контексте импортирующего скрипта. При этом получается объект-модуль, и ссылка на него помещается в переменную module_name в импортирующем скрипте.
Пример:
# a.py
def somefunc():
    print('Hi!')

print('a is executed')

# b.py
import a  # >>> a is executed
a.somefunc()  # >>> Hi!

Имя, под которым импортируется модуль, помещается в переменную __name__. Изменим код так:
# a.py
def somefunc():
    print('Hi!')

print(__name__, 'is executed')

# b.py
import a  # >>> a is executed
a.somefunc()  # >>> Hi!
print('And I am', __name__)  # >>> And I am __main__

Таким образом, мы видим, что для исполняемого скрипта переменная __name__ содержит строку "__main__", а импортируемые скрипты увидят в ней только своё имя. Причем неважно, если ты переименуешь модуль:
# a.py
def somefunc():
    print('Hi!')

print(__name__, 'is executed')

# b.py
# импортируем модуль и переименовываем его
import a as d  # >>> a is executed
d.somefunc()  # >>> Hi!
print('And I am', __name__)  # >>> And I am __main__

Именно эта особенность и позволяет писать код, который выполнится только если питон-скрипт выполняется непосредственно.
# a.py
# Этот код выполнится в любом случае
def somefunc():
    print('Hi!')

if __name__ == '__main__':
    # этот код выполнится только если a выполняется непосредственно
    print(__name__, 'is executed') # Всегда выведет __main__ is executed
else:
    # а этот код выполнится только если a импортируется в другой модуль
    print('Imported as', __name__)
# b.py
import a  # >>> Imported as a
a.somefunc()  # >>> Hi!
print('And I am', __name__)  # >>> And I am __main__
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы