gpt4 book ai didi

python - 我应该使用 `import os.path` 还是 `import os` ?

转载 作者:IT老高 更新时间:2023-10-28 12:32:30 25 4
gpt4 key购买 nike

根据official documentation , os.path 是一个模块。那么,导入它的首选方式是什么?

# Should I always import it explicitly?
import os.path

或者……

# Is importing os enough?
import os

请不要回答“导入 os 对我有用”。我知道,它现在也适用于我(从 Python 2.6 开始)。我想知道的是关于这个问题的任何官方建议。因此,如果您回答了这个问题,请发布您的引用资料

最佳答案

os.path 以一种有趣的方式工作。看起来 os 应该是一个带有子模块 path 的包,但实际上 os 是一个普通的模块,它与 sys 一起发挥作用.modules 来注入(inject) os.path。以下是发生的事情:

  • 当 Python 启动时,它会将一堆模块加载到 sys.modules 中。它们没有绑定(bind)到脚本中的任何名称,但是当您以某种方式导入它们时,您可以访问已经创建的模块。

    • sys.modules 是一个缓存模块的字典。当你导入一个模块时,如果它已经被导入到某个地方,它会获取存储在 sys.modules 中的实例。
  • os 是 Python 启动时加载的模块之一。它将其 path 属性分配给特定于操作系统的路径模块。

  • 它会注入(inject) sys.modules['os.path'] = path 以便您能够像执行“import os.path”一样它是一个子模块。

我倾向于将 os.path 视为 我想使用的模块 而不是 os 模块中的东西,所以即使它真的不是一个名为 os 的包的子模块,我导入它有点像它是一个,我总是这样做导入 os.path。这与 os.path 的记录方式是一致的。


顺便说一句,我认为这种结构会导致很多 Python 程序员早期对模块和包以及代码组织感到困惑。这真的有两个原因

  1. 如果您将 os 视为一个包,并且知道您可以执行 import os 并可以访问子模块 os.path,以后你可能会感到惊讶,因为你不能在不导入的情况下执行 import twisted 并自动访问 twisted.spread

  2. os.name 是一个普通的东西,一个字符串,而 os.path 是一个模块,这很令人困惑。我总是用空的 __init__.py 文件来构建我的包,这样在同一级别我总是有一种类型的东西:模块/包或其他东西。几个大型 Python 项目采用这种方法,这往往会产生更结构化的代码。

关于python - 我应该使用 `import os.path` 还是 `import os` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2724348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com