假设我有一个模块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()
但我不确定这通常是需要什么,或者我的代码本身是否有问题。 (我认为通常需要直接导入子模块......但是我可以发誓我已经看到代码不能直接导入并且仍能正常工作。)
答案 0 :(得分:1)
如果我想在
foo.bar
中使用某种方法,是否需要直接导入foo.bar
或导入foo
是否足够?
您需要明确导入子模块。执行import foo.bar
将自动导入父模块foo
,并且必须†绑定名称foo
,但反之则不然。
但是我可以发誓我已经看到代码没有直接导入并且仍能正常工作
是。有时访问子模块没有显式导入。当父模块本身导入子模块时会发生这种情况。除非记录在案,否则永远不要依赖它,因为它可能是一个实现细节,并且在库版本升级后可能会在没有警告的情况下更改。
作为展示两种行为的热门图书馆的示例,请查看requests==2.18.4
。该软件包包含名为sessions
和help
的子模块(以及其他软件包)。导入requests
会隐式提供requests.sessions
,但requests.help
在明确导入之前将无法使用。你会发现什么时候执行包init的源代码the sessions
submodule gets imported,但help
子模块没有。
† 这是有道理的,因为后续使用foo.bar
需要对现有foo
对象进行属性访问。请注意,虽然from foo.bar import something
和foo
模块都已导入并缓存到foo.bar
,但<{1}} 不会绑定名称foo
或foo.bar
sys.modules
。 子>