为什么os.path.join抛弃了参数?

Jon*_*son 12 python language-design

我正在学习Python,我注意到我的一个脚本有些奇怪.做一点测试我发现问题源于这种行为:

>>> import os
>>> os.path.join('a','b')
'a/b'
>>> os.path.join('a','/b')
'/b'
Run Code Online (Sandbox Code Playgroud)

检查文档,实际上这是函数的设计:

os.path中.join(path1 [,path2 [,... ]])

智能地加入一个或多个路径组件.如果任何组件是绝对路径,则所有以前的组件(在Windows上,包括之前的驱动器号,如果有的话)都将被丢弃,并继续加入....

我的问题不是我的脚本失败的原因,而是为什么函数是这样设计的.我的意思是,至少在Unix上a//b,如果不是优雅的话,是指定路径的完全可接受的方式.为什么功能是这样设计的?有没有办法判断一个或多个路径元素是否已被丢弃,而os.path.isabs()不是测试每个路径字符串?


出于好奇,我还检查了一个路径组件以os.sep字符结尾的情况:

>>> os.path.join('a/','b')
'a/b'
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

unu*_*tbu 14

如果您向用户询问文件名os.path.join('a', '/b'),则返回的一个案例就是返回/b.

用户可以输入相对于当前目录的路径或完整路径,并且您的程序可以处理这两种情况:

os.path.join(os.getcwd(), filename)
Run Code Online (Sandbox Code Playgroud)
In [54]: os.getcwd()
Out[54]: '/tmp'

In [55]: os.path.join(os.getcwd(), 'foo')
Out[55]: '/tmp/foo'

In [56]: os.path.join(os.getcwd(), '/foo/bar')
Out[56]: '/foo/bar'
Run Code Online (Sandbox Code Playgroud)

  • Guido从[第一次修订版](http://hg.python.org/cpython/file/5570dbb1ce55/Lib/posixpath.py#11)(其中函数以`cat`开头,后来到被重命名为`join`). (4认同)