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

Python 我需要直接导入子模块吗?,python,import,Python,Import,假设我有一个模块foo和一个子模块foo.bar。如果我想使用foo.bar中的方法,我需要直接导入foo.bar,还是导入foo就足够了 例如,以下内容会引发错误: import foo foo.bar.my_method() 以及以下工作: import foo.bar foo.bar.my_method() 但我不确定这是否是通常需要的,或者我的代码本身是否有问题。(我认为直接导入子模块通常是必要的……但我可以发誓,我看到的代码不是直接导入的,仍然可以正常工作。) 如果我想使用fo

假设我有一个模块
foo
和一个子模块
foo.bar
。如果我想使用
foo.bar
中的方法,我需要直接导入
foo.bar
,还是导入
foo
就足够了

例如,以下内容会引发错误:

import foo

foo.bar.my_method()
以及以下工作:

import foo.bar

foo.bar.my_method()
但我不确定这是否是通常需要的,或者我的代码本身是否有问题。(我认为直接导入子模块通常是必要的……但我可以发誓,我看到的代码不是直接导入的,仍然可以正常工作。)

如果我想使用
foo.bar
中的方法,我需要直接导入
foo.bar
,还是导入
foo
就足够了

您需要显式导入子模块。执行
import foo.bar
将自动导入父模块
foo
,必要时†绑定名称
foo
,但反之不成立

但我可以发誓,我看到的代码不是直接导入的,仍然可以正常工作

对。有时,访问子模块时不需要显式导入。当父模块本身导入子模块时,就会发生这种情况。除非有文档记录,否则不要依赖它,因为它可能是一个实现细节,在库版本升级后可能会在没有警告的情况下更改

作为演示这两种行为的流行库的示例,请看
requests==2.18.4
。此软件包包含名为
会话
帮助
(以及其他)的子模块。导入
请求
将使
请求。会话
隐式可用,而
请求。帮助在显式导入之前将不可用。当包init的源代码被执行时,您会发现,但是
help
子模块没有


†这很有意义,因为后续使用
foo.bar
需要对现有
foo
对象进行属性访问。请注意,
from foo.bar import something
不会绑定名称
foo
也不会绑定
foo.bar
,尽管这两个模块
foo
foo.bar
都被导入并缓存到
sys.modules

哦,非常有帮助,谢谢!在中,如果这些导入未直接用于
\uuuu init\uuuuuuuuuuuuuuuuupy
文件中,那么从.sessions导入session,session
的原因是什么?只是为了使导入
requests.sessions
不是绝对必要的?这可能是一种方便-将名称向上拉到父命名空间中。库用户现在可以从requests import Session编写导入语句
,该语句较短,但相当于requests.sessions import Session