代码之家  ›  专栏  ›  技术社区  ›  Denilson Sá Maia

我应该使用“import os.path”还是“import os”?

  •  120
  • Denilson Sá Maia  · 技术社区  · 16 年前

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

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

    或者…

    # Is importing os enough?
    import os
    

    请不要回答“导入” os 为我工作。我知道,它现在也适用于我(从Python2.6开始)。我想知道的是关于这个问题的任何官方建议。所以,如果你回答这个问题,请 发布你的推荐信 .

    7 回复  |  直到 7 年前
        1
  •  137
  •   Honest Abe Cody Piersall    12 年前

    os.path 以一种有趣的方式工作。看起来像 os 应该是包含子模块的包 path 但实际上 操作系统 是一个正常的模块 sys.modules 注入 OS.PATH . 以下是发生的事情:

    • 当python启动时,它将一组模块加载到 系统模块 . 它们没有绑定到脚本中的任何名称,但是当您以某种方式导入它们时,可以访问已经创建的模块。

      • 系统模块 是缓存模块的dict。当导入模块时,如果该模块已导入到某个位置,则它将获取存储在 系统模块 .
    • 操作系统 是在Python启动时加载的模块之一。它指派它的 路径 特定于操作系统的路径模块的属性。

    • 它注入 sys.modules['os.path'] = path 这样你就能做到” import os.path “就像是一个子模块。

    我倾向于想 OS.PATH 作为 我要使用的模块 而不是 一件事 操作系统 模块 所以即使不是 真正地 称为 操作系统 ,我导入它就像它是一个 我总是这样做 导入OS.PATH . 这与 OS.PATH 记录在案。


    顺便说一句,我认为这种结构导致了许多Python程序员对模块、包和代码组织的早期混淆。这有两个原因

    1. 如果你想到 操作系统 作为一个包裹,你知道你能做到 import os 并且可以访问子模块 OS.PATH 如果你不能做到,你可能会很惊讶 import twisted 自动访问 twisted.spread 不导入它。

    2. 令人困惑的是 os.name 是一个普通的东西,一根绳子,和 OS.PATH 是一个模块。我总是用空包装 __init__.py 文件,这样在同一级别上,我总是有一种类型的东西:模块/包或其他东西。一些大型的Python项目采用这种方法,这会使代码更加结构化。

        2
  •  29
  •   Nick T twasbrillig    16 年前

    按照 PEP-20 蒂姆·彼得斯认为,“显式优于隐式”和“可读性很重要”。如果你需要从 os 模块在 os.path , import os.path 会更明确,让别人知道你真正关心的是什么。

    同样,PEP-20也会说“简单胜于复杂”,所以如果你还需要更一般的东西 操作系统 雨伞, import os 最好是。

        3
  •  15
  •   Lesmana    12 年前

    最终答案: import os 使用 os.path . 不 import os.path 直接。

    从模块本身的文档中:

    >>> import os
    >>> help(os.path)
    ...
    Instead of importing this module directly, import os and refer to
    this module as os.path.  The "os.path" name is an alias for this
    module on Posix systems; on other systems (e.g. Mac, Windows),
    os.path provides the same operations in a manner specific to that
    platform, and is an alias to another module (e.g. macpath, ntpath).
    ...
    
        4
  •  6
  •   Matt Boehm    16 年前

    有趣的是,导入os.path将导入所有操作系统。在交互式提示中尝试以下操作:

    import os.path
    dir(os)
    

    结果将与您刚导入的操作系统相同。这是因为os.path将根据您拥有的操作系统引用不同的模块,所以python将导入os以确定要为path加载哪个模块。

    reference

    用一些模块,说 import foo 不会曝光 foo.bar 所以我想这真的取决于具体模块的设计。


    一般来说,只导入所需的显式模块应该稍微快一点。在我的机器上:

    import os.path : 7.54285810068e-06

    import os : 9.21904878972e-06

    这些时间非常接近,可以忽略不计。您的程序可能需要使用来自 os 不管是现在还是以后,通常牺牲两微秒并使用是有意义的 导入操作系统 以避免以后出现此错误。我通常只支持将操作系统作为一个整体导入,但可以理解为什么有些人更喜欢 导入OS.PATH 在技术上更有效地向代码的读者传达 操作系统 需要使用的模块。它本质上归结为我心目中的一个风格问题。

        5
  •  4
  •   tzot    16 年前

    找不到任何确定的引用,但我看到的示例代码 os.walk 使用os.path但只导入os

        6
  •  2
  •   Cyker    7 年前

    常识在这里起作用: os 是一个模块,并且 os.path 也是一个模块。因此,只需导入要使用的模块:

    • 如果要在 操作系统 模块,然后导入 操作系统 .

    • 如果要在 OS.PATH 模块,然后导入 OS.PATH .

    • 如果要在两个模块中使用功能,请导入两个模块:

      import os
      import os.path
      

    供参考:

        7
  •  -1
  •   Himanshu Chauhan    9 年前

    我同意迈克的看法

    我想

    import os 很好。

    你刚才必须提到这样的细节

    os.path()
    

    或者如果您正在调用模块内的模块

    os.path.exists()
    
    推荐文章