我是否需要直接导入子模块?

乔:

假设我有一个模块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该程序包具有称为sessions和的子模块help(以及其他子模块)。导入requestsrequests.sessions隐式可用,但是requests.help直到显式导入才可用。当执行初始化包的源代码,你会发现sessions子模块导入的数据,但help子模块没有。

这是有道理的,因为后续的使用foo.bar需要对现有foo对象进行属性访问请注意,from foo.bar import something没有绑定的名称foo,也没有foo.bar,尽管这两个模块foofoo.bar进口和缓存到sys.modules

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章