2

os.path模块似乎是所有路径相关功能的默认模块。然而,该listdir()函数是模块的一部分os而不是os.path模块,即使它接受路径作为其输入。为什么做出这个设计决定?

4

1 回答 1

12

os我个人觉得和之间的划分os.path有点不一致。根据文档,os.path应该只是与特定平台的路径一起使用的模块的别名(即,在 OS X、Linux 和 BSD 上你会得到posixpath,在 Windows 或古老的 Mac 上你会得到别的东西)。

>>> 导入操作系统
>>> 帮助(操作系统)
关于模块 os 的帮助:

姓名
    os - Mac、NT 或 Posix 的操作系统例程,具体取决于我们使用的系统。
...
>>> 帮助(os.path)
关于模块 posixpath 的帮助:

姓名
    posixpath - 对 Posix 路径名的常见操作。

listdir函数不对路径本身进行操作,而是对路径标识的目录进行操作。大多数函数在os.path实际路径上运行,而不是在文件系统上运行。

这意味着其中的许多函数os.path是字符串操作函数,并且其中的大多数函数os是 IO 函数/系统调用。

例子:

  • os.path.join, os.path.dirname, os.path.splitext, 只是字符串操作函数。

  • os.listdir, os.getcwd, os.remove,os.stat都是系统调用,实际上触及文件系统。

反例:

  • os.pathhas exists, getmtime, islink, 和其他基本上是 wrappers 的os.stat,并触及文件系统。我认为它们分类错误,但其他人可能不同意。

当天有趣的事实:您不会在库文档的顶层中找到模块,但您实际上可以导入os.path任何平台的版本,而无需在该平台上实际运行。这记录在文档中os.path

但是,如果您想操作始终采用其中一种不同格式的路径,您也可以导入和使用各个模块。它们都有相同的界面:

  • posixpath对于 UNIX 风格的路径
  • ntpath对于 Windows 路径
  • macpath用于旧式 MacOS 路径
  • os2emxpath对于 OS/2 EMX 路径

你不能用 做同样的事情os,这没有任何意义。

于 2012-04-23T03:04:58.470 回答