"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__.py
或 pygame/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>
我刚发现当我做的时候
import pygame.joystick
我不仅可以访问 joystick
,还可以访问 display
,例如我可以执行
pygame.display.init()
就像我只是简单地导入了 pygame
。
有什么区别?
导入时,执行模块顶层的内部代码,并将模块添加到 sys.modules
并可供使用。根据源文件中的内容,任何事情都可能发生。
在您的情况下,pygame/__init__.py
或 pygame/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>