Импорт функции из другого файла .py импортирует больше, чем просто эта функция? - PullRequest
0 голосов
/ 02 июля 2018

Чтобы проиллюстрировать проблему, пожалуйста, учтите следующее. У меня есть два .py файла, один с именем main.py, а другой с именем testfuction.py. Они оба находятся в одном каталоге.

Содержимое main.py:

from testfunction import mytestfunction

mytestfunction()

Содержимое testfunction.py:

def mytestfunction():
    for number in range(0,10):
        print number

print "Hi"

У меня сложилось впечатление, что импорт функции будет импортировать только эту функцию. Однако, когда я запускаю main.py, вот что я получаю:

Hi
0
1
2
3
4
5
6
7
8
9
>>> 

Почему вызывается функция печати? Это не часть функции, которую я импортировал!

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

У меня сложилось впечатление, что импорт функции будет импортировать только эту функцию.

Вы ошиблись.

При первом импорте модуля оператор import выполнит весь модуль, включая все операторы печати глобального уровня. Последующий импорт того же модуля будет повторно использовать существующий модуль, кэшированный в sys.modules, что может быть тем, как вы пришли к неправильному пониманию того, что весь модуль не выполнен.

Часто вы найдете код, который не предназначен для выполнения во время импорта, который находится внутри условного выражения, например:

def mytestfunction():
    for number in range(0,10):
        print number

if __name__ == "__main__":
    print "Hi"
0 голосов
/ 02 июля 2018

этот вопрос кажется дубликатом этого .

Вкратце: весь код файла Python вызывается при импорте модуля. То, что не является ни функцией, ни классом, обычно помещается в main функцию, вызываемую здесь:

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()

Пожалуйста, подумайте о закрытии этой темы.

0 голосов
/ 02 июля 2018

Чтобы импортировать что-либо из модуля, Python должен сначала загрузить этот модуль. В этот момент весь код на уровне модуля выполняется.

Согласно документам :

Модуль может содержать как исполняемые операторы, так и функции определения. Эти операторы предназначены для инициализации модуля. Они выполняются только при первом обращении к имени модуля в операторе импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...