чем разница между "import foo.bar" и "import foo"? - PullRequest
1 голос
/ 11 мая 2019

Я только что обнаружил, что когда я делаю

import pygame.joystick

У меня есть не только доступ к joystick, но и к display, т. Е. Я могу, например, сделать

pygame.display.init()

точно так же, как если бы я просто импортировал pygame.

В чем разница?

Ответы [ 3 ]

4 голосов
/ 11 мая 2019

Происходит то, что импорт pygame.joystick запускает дополнительный импорт; либо сам пакет pygame, либо pygame.joystick, либо любой из pygame.* модулей, импортируемых этими двумя модулями, куда-то импортируют pygame.display.

То, что вы теперь можете ссылаться на pygame.display, является случайностью деталей реализации. Возможно, вы не сможете сделать это в будущих версиях (например, если проекту больше не нужно импортировать pygame.display для загрузки pygame.joystick).

Лучше придерживаться явного импорта в вашем собственном проекте.

4 голосов
/ 11 мая 2019

При импорте выполняется внутренний код модуля на верхнем уровне, и модуль добавляется в sys.modules и становится доступным для использования.Исходя из того, что было внутри исходного файла, все может и может произойти.

В вашем случае, либо pygame/__init__.py, либо pygame/joystick.py содержит:

import pygame.display

Отсюда и наличиемодуль, который вы даже не пытались импортировать.

0 голосов
/ 11 мая 2019

В исходном коде джойстика они импортируют pygame.display или pygame и тому подобное.

В версии C документации:

В файле joystick.c они включили джойстик.h

#include <joystick.h>
...