Дано:Почему запуск подмодуля (python -m a.c) также импортирует содержащий модуль?
tree
~/dir
▶ tree
.
├── a
│ ├── __init__.py
│ ├── c.py
└── b.py
1 directory, 3 files
*.py
файлы
~/dir
▶ tail -n +1 **/*.py
==> a/__init__.py <==
print(__name__)
import a.c
==> a/c.py <==
print(__name__)
==> b.py <==
print(__name__)
import a
I/O
~/dir
▶ python3 -m a.c
a
a.c
__main__
Модуль a.c
не имеет зависимостей от модуля a
. Итак, почему Python запускает модуль a
, как если бы он импортировал его? Для меня это удивительное поведение. Я не ожидал, что запуск скрипта без импорта приведет к тому, что сам скрипт будет импортироваться и оцениваться дважды. Разве это не опасно для скриптов, которые не используют защиту if __name__ == "__main__"
?
Какое оправдание этому поведению? Почему Python должен оценивать содержащийся модуль при запуске его подмодуля?
Я не думал об объектах, выставленных '__init __. Py'. –