【问题标题】:Do I need to import submodules directly?我需要直接导入子模块吗?
【发布时间】:2018-04-04 02:04:27
【问题描述】:

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

例如,以下会引发错误:

import foo

foo.bar.my_method()

以下作品:

import foo.bar

foo.bar.my_method()

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

【问题讨论】:

    标签: python import


    【解决方案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 something绑定名称foofoo.bar,尽管foofoo.bar 两个模块都被导入并缓存到sys.modules

    【讨论】:

    • 哦,超级有帮助,谢谢!在__init__.py you linked to 中,如果__init__.py 文件中没有直接使用这些导入,from .sessions import session, Session 的原因是什么?只是为了让导入requests.sessions 不是绝对必要的?
    • 这可能是一种方便 - 将名称拉入父命名空间。图书馆用户现在可以编写导入语句from requests import Session,它更短但等效于from requests.sessions import Session
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多