python - 我需要直接导入子模块吗?

标签 python import

假设我有一个模块 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 import foo.bar directly or is importing foo 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。这个包有子模块称为 sessionshelp (等等)。导入 requests 将使 requests.sessions 隐式可用,但 requests.help 在显式导入之前不可用。当包 init 的源代码被执行时,你会发现 the sessions submodule gets imported ,但是 help 子模块没有。

这是有道理的,因为 foo.bar 的后续使用需要对现有 foo 对象进行属性访问。请注意,from foo.bar import something 绑定(bind)名称 foofoo.bar,尽管这两个模块foofoo.bar 被导入并缓存到 sys.modules 中。

关于python - 我需要直接导入子模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49641621/

相关文章:

python - kivy:如何使用StringProperty和bind()?

postgresql - 如何将文本文件中的数据导入 postgres 数据库?

javascript - 如何在一个作为模块的 Javascript 文件与另一个不是模块的 Javascript 文件之间共享函数和变量

Java导入外部jar文件

javascript - 一行导入多个组件(VueJs)

python - 在Raspberry Pi上通过OpenCV编写的视频未运行

python - 附加数据后列表返回空

python - 谷歌应用引擎: BadQueryError: Parse Error: Expected no additional symbols at symbol GROUP

python - 项目加载器在 scrapy 中无法正常工作

Java 编译多个包中的 RMI 服务器/客户端应用程序