假设我有一个 modulefoo和一个 submodule foo.bar。如果我想使用 中的方法foo.bar,我需要foo.bar直接导入还是导入就foo足够了?
例如,以下内容会引发错误:
import foo
foo.bar.my_method()
Run Code Online (Sandbox Code Playgroud)
和以下作品:
import foo.bar
foo.bar.my_method()
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否通常是需要的,或者我的代码本身是否有问题。(我认为通常需要直接导入子模块......但我可以发誓我已经看到它不是直接导入的代码并且仍然可以正常工作。)
wim*_*wim 13
如果我想使用 中的方法
foo.bar,我需要foo.bar直接导入还是导入就foo足够了?
您需要显式导入子模块。执行import foo.bar会自动导入父模块foo,必然†绑定名称foo,反之则不然。
但是我可以发誓我已经看到了没有直接导入但仍然可以正常工作的代码
是的。有时访问子模块无需显式导入。当父模块本身导入子模块时会发生这种情况。除非它被记录在案,否则永远不要依赖它,因为它可能是一个实现细节,并且在库版本升级后可能会在没有警告的情况下发生变化。
作为演示这两种行为的流行库的示例,请查看requests==2.18.4. 这个包有子模块称为sessions和help(除其他外)。导入requests将requests.sessions隐式提供,但requests.help在显式导入之前不可用。当执行初始化包的源代码,你会发现该sessions子模块导入的数据,但help子模块没有。
† 这是有道理的,因为后续使用foo.bar需要对现有foo对象进行属性访问。请注意,from foo.bar import something并没有绑定的名称foo,也没有foo.bar,尽管这两个模块foo和foo.bar进口和缓存到sys.modules。