我需要直接导入子模块吗?
- 2025-03-12 08:55:00
- admin 原创
- 14
问题描述:
假设我有一个模块foo
和一个子模块foo.bar
。如果我想使用其中的方法foo.bar
,是否需要foo.bar
直接导入,还是导入就foo
足够了?
例如,以下内容将引发错误:
import foo
foo.bar.my_method()
以及以下作品:
import foo.bar
foo.bar.my_method()
但我不确定这是否是通常所需要的,或者我的代码本身是否有问题。(我认为通常需要直接导入子模块……但我敢发誓我见过没有直接导入但仍然运行良好的代码。)
解决方案 1:
如果我想使用中的方法
foo.bar
,我需要foo.bar
直接导入还是导入就foo
足够了?
您需要明确导入子模块。执行import foo.bar
将自动导入父模块foo
,并且必然†绑定名称foo
,但反之则不然。
但我敢发誓我见过没有直接导入的代码,但仍然可以正常工作
是的。有时无需显式导入即可访问子模块。当父模块本身导入子模块时,就会发生这种情况。除非有文档说明,否则切勿依赖它,因为它可能是实现细节,并且可能会在库版本升级后毫无预警地发生变化。
作为一个展示这两种行为的流行库的示例,请查看requests==2.18.4
。此包具有名为sessions
和的子模块help
(以及其他子模块)。导入requests
将requests.sessions
隐式提供,但requests.help
直到显式导入后才可用。您会发现,当执行包 init 的源代码时,子sessions
模块会被导入,但help
子模块不会。
† 这是有道理的,因为后续使用foo.bar
需要对现有对象进行属性访问foo
。请注意from foo.bar import something
不绑定名称也不绑定,尽管 和 两个模块都被导入并缓存到 中。foo
`foo.barfoo
foo.bar`sys.modules
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD