os.path.join()是如何工作的?

9
请帮忙理解内置的os.path.join()函数是如何工作的。例如:
import os
print os.path.join('cat','dog') # 'cat/dog' no surprise here
print os.path.join('cat','dog').join('fish') # 'fcat/dogicat/dogscat/dogh'

在Mac(我猜Linux也是如此),os.name是posixpath的别名。因此,查看posixpath.py模块,join()函数如下:
def join(a, *p):
"""Join two or more pathname components, inserting '/' as needed.
If any component is an absolute path, all previous path components
will be discarded.  An empty last part will result in a path that
ends with a separator."""
path = a
for b in p:
    if b.startswith('/'):
        path = b
    elif path == '' or path.endswith('/'):
        path +=  b
    else:
        path += '/' + b
return path

join()函数返回一个字符串。为什么os.path.join('something').join('something else')能够工作呢?它不应该抛出类似于“str”对象没有属性“join”的错误吗?我的意思是,如果我将函数复制到其他地方并像renamed_join('foo','bar')一样调用它,那么它会按预期工作,但如果我执行renamed_join('foo','bar').renamed_join('foobar'),就会像预期的那样引发AttributeError。希望这不是一个非常愚蠢的问题。当我认为我开始理解Python时,这个问题突然袭击了我...

更多理解请查看这里的答案 - Aamir Rind
1
你可以这样说:os.path.join('cat','dog','fish'),并且得到合理的结果。 - Robᵩ
1
“它难道不应该引发类似于'‘str’ object has no attribute 'join''这样的错误吗?” 不是的。Python不会欺骗你... - glglgl
2个回答

21

你不能像那样链接 os.path.joinos.path.join 返回一个字符串;调用该方法的 join 方法会调用常规字符串的join 方法,这与其完全无关。


所以这只是一个幸运的名字巧合。谢谢你为我澄清这个问题! - skamsie

8
你的第二个 `join` 调用不是 `os.path.join`,而是 `str.join`。它的作用是将参数(作为可迭代对象,意味着它可以被视为 `f, i, s, h`)与 self 作为分隔符(在你的情况下,是 `cat/dog`)连接起来。
所以,基本上它会在 `fish` 的每个字母之间插入 `cat/dog`。
因为 `str` 有一个 join 属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接