"import foo.bar" 和 "import foo" 的区别?

difference between "import foo.bar" and "import foo"?

我刚发现当我做的时候

import pygame.joystick

我不仅可以访问 joystick,还可以访问 display,例如我可以执行

pygame.display.init()

就像我只是简单地导入了 pygame

有什么区别?

导入时,执行模块顶层的内部代码,并将模块添加到 sys.modules 并可供使用。根据源文件中的内容,任何事情都可能发生。

在您的情况下,pygame/__init__.pypygame/joystick.py 中的任何一个包含:

import pygame.display

因此您甚至没有尝试导入的模块的可用性。

发生的事情是导入 pygame.joystick 会触发额外的导入; pygame 包本身,或 pygame.joystick,或这两个模块导入的任何 pygame.* 模块,恰好在某处导入 pygame.display

所以您现在可以引用 pygame.display 是实施细节的意外。您可能无法在未来的版本中(如果项目不再需要导入 pygame.display 来加载 pygame.joystick)。

最好坚持在您自己的项目中显式导入。

在操纵杆的源代码中,他们正在导入 pygame.display 或 pygame 和排序。

在 C 版本的文档中:

在文件 joystick.c 中,他们包含了 joystick.h

#include <joystick.h>