Python 我应该使用“导入os.path”还是“导入os”?

Python 我应该使用“导入os.path”还是“导入os”?,python,coding-style,python-import,Python,Coding Style,Python Import,根据os.path是一个模块。那么,进口它的首选方式是什么 # Should I always import it explicitly? import os.path 或者 请不要回答“导入os适合我”。我知道,它现在也适用于我(从Python 2.6开始)。我想知道的是关于这个问题的任何官方建议。因此,如果您回答这个问题,请发布您的参考资料有趣的是,导入os.path将导入所有操作系统。在交互式提示中尝试以下操作: import os.path dir(os) 结果将与您刚刚导入的操作系

根据os.path是一个模块。那么,进口它的首选方式是什么

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


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

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

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

对于某些模块,说
import foo
不会暴露
foo.bar
,因此我想这确实取决于特定模块的设计


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

导入操作系统路径
7.54285810068e-06

导入操作系统
9.21904878972e-06


这些时间非常接近,几乎可以忽略不计。您的程序可能现在或以后需要使用
os
中的其他模块,因此通常只需牺牲两微秒,然后使用
import os
即可避免以后出现此错误。我通常只支持将操作系统作为一个整体导入,但我可以理解为什么有些人更希望
import os.path
在技术上更高效,并向代码读者传达这是
os
模块中唯一需要使用的部分。在我看来,这基本上归结为一个风格问题。

找不到任何明确的参考,但我看到示例代码使用os.path,但只导入os

,正如Tim Peters所说,“显式优于隐式”和“可读性计数”。如果您需要从
os
模块获得的所有信息都在
os.path
下,
import os.path
将更加明确,并让其他人知道您真正关心的是什么


同样,PEP-20也说“简单胜于复杂”,因此,如果您还需要更通用的
os
保护伞下的东西,
导入os
将是首选。

os.path
的工作方式很有趣。看起来
os
应该是一个包含子模块
path
的包,但实际上
os
是一个正常的模块,它通过
sys.modules
来注入
os.path
。下面是发生的情况:

  • 当Python启动时,它将一组模块加载到
    sys.modules
    中。它们不会绑定到脚本中的任何名称,但在以某种方式导入已创建的模块时,您可以访问这些模块

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

  • 它注入
    sys.modules['os.path']=path
    ,这样您就可以像导入子模块一样执行“
    import os.path

我倾向于认为
os.path
是我想要使用的一个模块,而不是
os
模块中的一个东西,因此,即使它实际上不是名为
os
的包的子模块,我还是像导入一个一样导入它,我总是做
import os.path
。这与
os.path
的记录方式一致


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

  • 如果您将
    os
    视为一个包,并且知道您可以执行
    import os
    并访问子模块
    os.path
    ,那么您可能会惊讶于以后无法执行
    import twisted
    并自动访问
    twisted.spread
    ,而不导入它

  • 令人困惑的是,
    os.name
    是一个普通的东西,一个字符串,
    os.path
    是一个模块。我总是用空的
    \uuuu init\uuuu.py
    文件来构造我的包,这样在同一级别上我总是有一种类型的东西:模块/包或其他东西。一些大型Python项目采用这种方法,这种方法倾向于生成更结构化的代码


  • 明确答案:
    导入操作系统
    并使用
    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).
    ...
    

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

    • 如果要使用
      os
      模块中的功能,请导入
      os

    • 如果要使用
      os.path
      模块中的功能,请导入
      os.path

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

      import os
      import os.path
      
    供参考:

    • 使用
      os
      并导入
      os

    • 使用
      os.path
      并导入
      os.path

    • 同时使用和同时导入


    从操作系统导入路径
    将使对路径的调用更快,如果速度是个问题。作为pythonic,显式优于隐式,对吗?实际上,我认为这实际上是用户的判断调用,不管用户是只使用os.path还是操作系统中的多个模块。也许一种方法比另一种更符合你的哲学
    import os
    import os.path