"import foo.bar"和"import foo"的区别是什么?

3

我刚发现当我执行以下操作时

import pygame.joystick

我不仅可以访问手柄,还可以访问显示器,例如我可以执行以下操作:
pygame.display.init()

就像我简单地导入pygame一样。

有什么区别吗?


2
这是因为pygame.display是一个传递导入的依赖项。你不能指望每个包都会这样发生。最好显式地导入你的依赖项。 - Martijn Pieters
@MartijnPieters,这意味着包的初始化代码中有一个“import pygame.display”的语句? - A. Donda
1
请查看Python文档中的“导入子模块”部分(https://docs.python.org/3/reference/import.html#submodules),以了解一般行为。 - Nikos M.
1
@A.Donda:是的,也许在 pygame/__init__.py 中,或者 pygame.joystick 有那个导入,或者这两个中的任何一个导入了最终导入 pygame.display 的某些东西。这是一个实现细节。 - Martijn Pieters
3个回答

5
发生的情况是,导入 pygame.joystick 会触发额外的导入;无论是 pygame 包本身,还是 pygame.joystick 或这两个模块导入的任何 pygame.* 模块,都可能在某处导入 pygame.display

因此,现在能够引用 pygame.display 的事实是实现细节的偶然事件。将来版本中您可能不能这样做(例如,如果该项目不再需要导入 pygame.display 来加载 pygame.joystick)。
最好在您自己的项目中坚持使用显式导入。

4

导入时,模块顶层内部代码将被执行,并将该模块添加到sys.modules中,可供使用。基于源文件的内容,任何可能被执行。

在您的情况下,pygame/__init__.pypygame/joystick.py 中包含以下内容:

import pygame.display

因此,即使您没有尝试导入该模块,该模块仍然可用。

1
在手柄的源代码中,他们导入了pygame.display或pygame等内容。
在文档的C版本中:
在joystick.c文件中,他们已经包含了joystick.h。
#include <joystick.h>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接