假设我有一个模块 foo
和一个子模块 foo.bar
。如果我想使用 foo.bar
中的方法,我需要直接导入 foo.bar
还是导入 foo
就足够了?
例如,下面会抛出一个错误:
import foo
foo.bar.my_method()
以及以下作品:
import foo.bar
foo.bar.my_method()
但我不确定这是否是通常需要的,或者我的代码本身是否有问题。 (我认为通常需要直接导入子模块......但我可以发誓我已经看到代码没有直接导入但仍然可以正常工作。)
最佳答案
If I want to use a method in
foo.bar
, do I need to importfoo.bar
directly or is importingfoo
sufficient?
您需要显式导入子模块。执行import foo.bar
会自动导入父模块foo
,必然†绑定(bind)名称foo
,但是反之则不然。
But I could have sworn I've seen code where it's not imported directly and still works fine
是的。有时无需显式导入即可访问子模块。当父模块本身导入子模块时会发生这种情况。除非有记录,否则永远不要依赖它,因为它可能是一个实现细节,并且在库版本升级后可能会在没有警告的情况下发生变化。
作为演示两种 行为的流行库的示例,请查看requests==2.18.4
。这个包有子模块称为 sessions
和 help
(等等)。导入 requests
将使 requests.sessions
隐式可用,但 requests.help
在显式导入之前不可用。当包 init 的源代码被执行时,你会发现 the sessions
submodule gets imported ,但是 help
子模块没有。
† 这是有道理的,因为 foo.bar
的后续使用需要对现有 foo
对象进行属性访问。请注意,from foo.bar import something
不绑定(bind)名称 foo
和 foo.bar
,尽管这两个模块foo
和 foo.bar
被导入并缓存到 sys.modules
中。
关于python - 我需要直接导入子模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49641621/