如果要在中使用方法
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 importsomething并 没有
绑定的名称
foo,也没有
foo.bar,尽管这两个模块
foo和
foo.bar进口和缓存到
sys.modules。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)