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

时间:2018-04-04 02:04:28

标签: python import

假设我有一个模块IF DATETRUNC('week',[your date field]) = DATETRUNC('week',NOW()) THEN 'filter me' ELSE 'leave me' END 和一个子模块foo。如果我想在foo.bar中使用某个方法,是否需要直接导入foo.bar或导入foo.bar是否足够?

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

foo

以及以下作品:

import foo

foo.bar.my_method()

但我不确定这通常是需要什么,或者我的代码本身是否有问题。 (我认为通常需要直接导入子模块......但是我可以发誓我已经看到代码不能直接导入并且仍能正常工作。)

1 个答案:

答案 0 :(得分:1)

  

如果我想在foo.bar中使用某种方法,是否需要直接导入foo.bar或导入foo是否足够?

您需要明确导入子模块。执行import foo.bar将自动导入父模块foo,并且必须绑定名称foo,但反之则不然。

  

但是我可以发誓我已经看到代码没有直接导入并且仍能正常工作

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

作为展示两种行为的热门图书馆的示例,请查看requests==2.18.4。该软件包包含名为sessionshelp的子模块(以及其他软件包)。导入requests会隐式提供requests.sessions,但requests.help在明确导入之前将无法使用。你会发现什么时候执行包init的源代码the sessions submodule gets imported,但help子模块没有。

这是有道理的,因为后续使用foo.bar需要对现有foo对象进行属性访问。请注意,虽然from foo.bar import somethingfoo模块都已导入并缓存到foo.bar,但<{1}} 不会绑定名称foofoo.bar sys.modules